関数が第一級の対象であることの感覚とは?(2)
Stateモナド,Writerモナド,Readerモナドは、型の中に関数が「隠れている」感じがします。
どのような関数が型の中に「隠れている」かを見抜くことがポイントなのかなぁと思っています。
もっと単純な(役に立たない)コードで示すと:
test15.hs:
data AB = A (Int -> Int) | B (String -> String) foo :: AB -> String foo (A f) = show $ f 10 foo (B f) = f "xyz"
AB型を確認すると:
*Main> :i AB data AB = A (Int -> Int) | B (String -> String) -- Defined at test15.hs:2:6
*Main> :t A A :: (Int -> Int) -> AB *Main> :t B B :: (String -> String) -> AB *Main>
この段階では、コンストラクタに渡す関数が明示されています。
実際に、値(この構築した値はなんというのだろう?)をつくると、
*Main> let a = A (\x -> x * 3) *Main> :t a a :: AB *Main> let b = B (\x -> reverse x) *Main> : b b :: AB *Main>
それぞれの変数の型を確認するとAB型になっています。 ここでは、Int->IntなりString->Stringの関数があることが隠れているように思えます。
それzれの変数を関数fooに適用すると:
*Main> foo a "30" *Main> foo b "zyx"
となります。
ここで、関数fooの型を確認すると:
*Main> :t foo foo :: AB -> String
となり、関数が背後にあることは表に出ていません。 背後にある関数を意識することなくコードが読めればHaskellのコードリーティングが楽になるのではないかと思っています。