IT練習ノート

IT関連で調べたこと(実際は嵌ったこと)を書いています。

関数が第一級の対象であることの感覚とは?(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

コンストラクタA,コンストラクタBを確認すると:

*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のコードリーティングが楽になるのではないかと思っています。