关于MonadWriter的Noob问题:
monadWrite :: Writer String Int
monadWrite = writer (3003, "log 1\n")
为什么String
在typeig中排在首位,而Int
其次,而3003
显然是Int
而"log 1\n"
是{{1 }}。
我知道微不足道,但我想了解。
答案 0 :(得分:7)
没有特别的理由将结果(3003
首先放在输出("log 1\n"
)之后放在writer
的参数中。我认为顺序被选择为与internal representation of WriterT
相对应:
newtype WriterT w m a = WriterT { runWriterT :: m (a, w) }
(对于Writer
,m
是身份)。
但是,在Writer
的类型签名中,参数的顺序很重要。例如,如果我们查看带有成员的Functor
类型类
fmap :: (a -> b) -> f a -> f b
它使得用Writer String
代替Writer result
(或者通常是f
)并获得
fmap :: (a -> b) -> Writer result a -> Writer result b
这正是参数的正确顺序。交换它们将使实现Functor
成为不可能(没有任何技巧)。
对于使用多个参数的所有类型/函数,这都是正确的:将它们用作一个参数类型/函数的唯一方法是更改最后一个参数,而不是其他参数。
请参阅讨论类似问题的相关问题:
Switch order of arguments for instance declaration in Haskell