【发布时间】:2017-12-14 15:40:08
【问题描述】:
我只是尝试使用writer:
writer (5, "Hello, World")
但我注意到我收到了一个错误:
约束
MonadWriter [Char] m中的非类型变量参数
但我想知道我没有满足什么约束? [a] 毕竟是 Monoid...
【问题讨论】:
-
该特定错误消息的另一部分应该告诉您如何修复它。您可以使用
{-# LANGUAGE ... #-}pragma 启用它的建议。 -
它告诉我允许 FlexibleContexts。但为什么这甚至是必要的?我满足所有限制条件?
-
这里其实没有问题。你确实满足了所有的约束。 GHCi 不会打印任何结果的原因是它不知道整个事情应该是什么确切类型——你没有指定。实际上,通常没有必要,因为类型将从上下文中推断出来,但前提是存在 某些上下文(例如,将整个事物包装在
runWriter中)。 -
是的,强制类型
writer (5,"foo") :: Writer String Char有效。但为什么会有这种行为?Control.Monad.中的所有其他 monad 都没有这种行为... -
如果没有
FlexibleContexts,MonadWriter [Char] m根本就不是有效类型(但它是给定表达式的推断类型的约束,因此给定表达式的类型不正确)。其他 monad 转换器也会发生同样的事情(例如put "x"或('a':) <$> ask)