Haskell非类型变量参数

时间:2017-06-26 22:13:42

标签: haskell monads

我尝试使用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

为什么这会解决问题?

1 个答案:

答案 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

相关问题