Haskell 理解runWriter的输出(返回3::Writer String Int)
我正在阅读,下面是一个例子:Haskell 理解runWriter的输出(返回3::Writer String Int),haskell,Haskell,我正在阅读,下面是一个例子: instance (Monoid w) => Monad (Writer w) where return x = Writer (x, mempty) (Writer (x,v)) >>= f = let (Writer (y, v')) = f x in Writer (y, v `mappend` v') 然后进行以下评估: ghci> runWriter (return 3 :: Writer String
instance (Monoid w) => Monad (Writer w) where
return x = Writer (x, mempty)
(Writer (x,v)) >>= f = let (Writer (y, v')) = f x in Writer (y, v `mappend` v')
然后进行以下评估:
ghci> runWriter (return 3 :: Writer String Int)
(3,"")
对我来说,返回3
,当限制为编写器字符串Int
的类型时,应该给出(“3”,0)
(我不知道为什么我要输入0,但我想的mempty
的Int
应该是0。我也不太理解mempty
然后,当我们在return 3中运行runRead时,我们应该得到
(3, "")
我把3作为数字,因为它必须是一个数字,因为runReader会还原类型。请看Writer
类型页面上给出的定义:
newtype Writer w a = Writer { runWriter :: (a, w) }
查看等式两侧的a
和w
顺序?查看元组顺序与类型参数顺序的不同之处
这意味着Writer String Int
类型的值将是(Int,String)
类型的元组,它包装在Writer
构造函数中
runWriter
只是“展开Writer
构造函数”的一个花哨名称.MTL 2.0.0.0改变了Writer
在引擎盖下的实现方式。它现在使用monad转换器,而不是简单的元组,LYAH从未更新以考虑到这一点。这里的问题到底是什么?请注意Writer
有两个类型参数:第一个是用于monoid累加器的(在您的示例中是一个String
),第二个是随着fmap
/>=
操作而变化的字符串(返回3
中的Int
)。Writer String Int
的“内部元组”具有类型(Int,String)
return
正在使用String
的mempty
,而不是Int
。