Haskell 在哈斯凯尔有与作家莫纳德的彭定康匹配吗?

Haskell 在哈斯凯尔有与作家莫纳德的彭定康匹配吗?,haskell,monads,Haskell,Monads,在Haskell中,模式匹配的正确方法是什么 我想做如下事情 import Control.Monad.Writer hoge :: Writer [Int] (Int, String) -> String hoge (Writer (_, (_, s))) = s 实际上,我真的不知道Writer和WriterT和Writer.Identity之间的区别,等等 非常感谢您的指导。如果我正确理解了您的意图,您可以使用运行Writer从您的编写器中获取((Int,String),[Int]

在Haskell中,模式匹配的正确方法是什么

我想做如下事情

import Control.Monad.Writer
hoge :: Writer [Int] (Int, String) -> String
hoge (Writer (_, (_, s))) = s
实际上,我真的不知道
Writer
WriterT
Writer.Identity
之间的区别,等等


非常感谢您的指导。

如果我正确理解了您的意图,您可以使用
运行Writer
从您的
编写器中获取
((Int,String),[Int])
,然后从中提取字符串。类似于
snd的东西。fst。可能是runWriter…


WriterT
是当您需要将
Writer
与其他monad组合时使用的工具。与其为
Writer
WriterT
编写单独但类似的实现,不如只为
WriterT
编写实现,并将
Writer
定义为使用
标识的
WriterT
Identity
monad实际上什么都不做;您可以简单地假装它不在那里。

您可能想查看Writer和Writer的名称。为什么在以后放弃编写结果时要创建Writer?或者换一种说法,为什么你需要一个编写器,而不能只使用一个纯函数呢?上面的函数只是一个示例。在实际代码中,我总是使用Writer和monad函数(>>=)。谢谢。我知道runWriter的功能。但是
let s=snd$fst$runWriter w
太长了。我希望我能通过模式匹配获得内容。你不能在它上进行模式匹配,因为它不是一种新的数据类型