はLYAH読んで、私は、コードのこの部分につまずいた:高次多型は厳密な引数の順序を必要としますか?
newtype Writer w a = Writer { runWriter :: (a, w) }
instance (Monoid w) => Monad (Writer w) where
return x = Writer (x, mempty)
(Writer (x,v)) >>= f = let (Writer (y, v')) = f x in Writer (y, v `mappend` v')
一体最初の行でWriter w
が何であるかを理解しようとしますが、私はこれは完全なタイプをされていない発見が、型コンストラクタの一種でMaybe String
ためMaybe
のような1つの引数には、偉大なルックスが、何かのWriter'
は、このように、スワップ型引数で定義されている場合は、最初のタイプ:
newtype Writer' a w = Writer' { runWriter :: (a, w) }
Monadインスタンスを今すぐ実装できますか?このような何かが、何実際にコンパイルすることができます。
instance (Monoid w) => Monad (\* -> Writer' * monoid) where
\* -> Writer' * monoid
のアイデアはWriter w
と同じです: 1型の引数が不足しているとの型コンストラクタ - この時間は最初の1。
'Writer'は、' Monad'インスタンスを持つ明示的な目的のために定義します。スワップされた引数で定義する必要はありません。そして、あなたが決定可能な型チェックをしたいならば、そのような型レベル関数を書くことはできません。 –