Haskell MonadWriter类型签名

时间:2019-03-26 09:29:27

标签: haskell monads writer type-signature

关于MonadWriter的Noob问题:

monadWrite :: Writer String Int
monadWrite = writer (3003, "log 1\n") 

为什么String在typeig中排在首位,而Int其次,而3003显然是Int"log 1\n"是{{1 }}。 我知道微不足道,但我想了解。

1 个答案:

答案 0 :(得分:7)

没有特别的理由将结果(3003首先放在输出("log 1\n")之后放在writer的参数中。我认为顺序被选择为与internal representation of WriterT相对应:

newtype WriterT w m a = WriterT { runWriterT :: m (a, w) }

(对于Writerm是身份)。

但是,在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

Currying out of order in Haskell