Maybeモナド
ふつうのHaskellプログラミング p263
書籍中ではlookup関数を使った例が示してあるので、別の例をやってみる。
リファレンスマニュアルを探したところ、
find :: (a -> Bool) -> [a] -> Maybe a
ってのが、それっぽかったので、やってみる。
リスト[a]から、関数(a -> Bool)がTrueとなる最初の要素を返すという仕様らしい。
import List main = print $ find test [1,2,3] test x = if x > 1 then True else False
結果はこう。
Just 2
おお、なんか動いた。しかし、なんかJustってのがジャマっぽい。(なんじゃそら)
ので、取ってみる。
import List import Data.Maybe main = print $ fromJust $ find test [1,2,3] test x = if x > 1 then True else False
結果はこう。
2
Just取れた。
せっかくなので、>>=を使ってモナドっぽいのを書いてみる。
文字列のリストからbで始まってcで終わる要素を取り出してみる。
import List main = print $ return ["aaa", "bbc", "ccc"] >>= find startsWithB >>= find endsWi thC startsWithB xs = if (head xs) == 'b' then True else False endsWithC x = if x == 'c' then True else False
結果はこう。
Just 'c'
ちなみに、
["aaa", "bbb", "ccc"]
にすると、
Nothing
となるが、
["aaa", "bbb", "ccc", "bbc"]
としても、
Nothing
となる。
bで始まる最初の要素は"bbb"なので、これに対して'c'で終わるかの判定が入り、結果Nothingとなります。うーん、いまいち。全く実用的じゃないね。これ。
viでファイルを暗号化(復号化)する
一時期ヒマだったので、man viとかして、なんか知らないことがないか探してみた。
まあ、知らないことだらけだったりするわけですが、暗号化機能ってのがあるのを初めて知りました。
以下の実行例は、
~ VIM - Vi IMproved ~ ~ version 7.0.235 ~ by Bram Moolenaar et al. ~ Vim is open source and freely distributable
で試しました。
-xオプション付きでviを起動する。
>vi -x hello.txt
すると、
Enter encryption key:
のように聞いてくるので、暗号化キーを入力する。
Enter same key again:
同じのをもっかい入れる。
すると、普通にファイルを作る画面になる。
1 ~ ~ ~ "hello.txt" [New File] 0,0-1 All
で、普通にファイル書いて、保存してみる。
1 Hello, World!! ~ ~ ~ :w
1 Hello, World!! ~ ~ ~ "hello.txt" [New][crypted] 1L, 15C written 1,14 All
[crypted]の文言辺りが、ちゃんと暗号化された気配を感じさせます。
で、vi終わってファイルをのぞいてみる。
> more hello.txt VimCrypt~01!ヨネキx・ム「檳em3S >
くちゃくちゃです(汗
もっかいviで開いてみる。
> vi hello.txt
Enter encryption key:
-xオプションをつけなくても、暗号化キーを聞いてくる。
あえて間違ったキーを打ち込むと、、
1 ~V^N、?~Oノ・゙ィ8ョ^_e ~ ~ ~ "hello.txt" [noeol][crypted] 1L, 15C 1,1 All
やっぱりくちゃくちゃです(汗
で、ちゃんと開きなおして、別のファイルに保存してみる。
1 Hello, World!! ~ ~ ~ :w hello2.txt
1 Hello, World!! ~ ~ ~ "hello2.txt" [New][crypted] 1L, 15C written 1,1 All
やっぱり[crypted]になる。
暗号化しないで保存するには、キーをクリアする。
:set key=
で、
:w
すると、
1 Hello, World!! ~ ~ ~ "hello.txt" 1L, 15C written 1,1 All
となり、
> more hello.txt Hello, World!! >
となりました。