ITコンサルの日常

ITコンサル会社に勤務する普通のITエンジニアの日常です。

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!!
>

となりました。