プログラマとプロマネのあいだ

プログラマもやるし、プロマネもやるし、たまに似非アーキとか営業っぽいこともやる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となります。うーん、いまいち。全く実用的じゃないね。これ。