m = Map.fromList [("a","b"), ("b","c"), ("c","d"), ("d","e")]
f x m = fromMaybe "default value" $ Map.lookup x m
lookup' x = f x m
モナドは今、私は読者のモナドを作成したいリーダーで動作するようにしてみてください。
:r = reader lookup'
-- Non type variable argument:
-- in the constraint MonadReader [Char] m
-- When checking the inferred type:
-- b :: forall (m :: * -> *). MonadReader [Char] m => m [Char]
ソリューションは、型を定義することでした
r = reader lookup' :: Reader String String
これはなぜ問題を解決しますか?
'Control.Monad.Reader'の代わりに' Control.Monad.Trans.Reader'をインポートします。後者は、より簡潔なコードを作成するより一般的なインターフェイスを公開しますが、時には、あなたが持っているようなあいまいメッセージを引き起こすこともあります。この特定の種類のものについてもっと知るには、 'トランスフォーマー'と 'mtl'の違いを読んでください。 – Alec