Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 理解runWriter的输出(返回3::Writer String Int)_Haskell - Fatal编程技术网

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