我尝试使用Reader Monad
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
现在我想创建一个读者monad:
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
为什么这会解决问题?
答案 0 :(得分:3)
直接问题是由于monomorphism restriction。对于这种情况的挥手解释是r = reader lookup'
看起来像是在定义一些具体的r
,因此Haskell将尝试推断它的单形类型签名(一个没有类型变量)。
自导入reader :: MonadReader r m => (r -> a) -> m a
以来,Haskell推断出reader lookup' :: MonadReader [Char] m => m [Char]
。不幸的是,这是不单态--Haskell并不确切地知道你想要m
。这就是错误消息所说的:类型变量m
是不明确的。
添加像reader lookup' :: Reader String String
这样的显式类型注释会消除此问题;现在可以推断出m ~ Reader String
。