了解作者类型

Understanding the writer type

我正在阅读 Miran Lipovaca 的 'Learn You a Haskell for Great Good!' 一书学习单子。我正在阅读 Control.Monad.Writer 模块如何导出 Writer w a 类型及其 Monad 实例以及一些用于处理此类型值的有用函数。

对于以下代码:

newtype Writer w a = Writer { runWriter :: (a,w) }

我知道a类型参数表示某个值的类型,w类型参数表示附加的幺半群值的类型。我说的对吗,通过将 wa 传递给 Writer 类型构造函数,您在 return 中得到了一个 Writer monad,这个 monad 只有一个函数是runWriter 函数?

在书中它说 runWriter 函数接受一个包装在 Writer 新类型中的元组并将其解包,returning 一个简单的元组。但是 runWriter 的类型声明是 runWriter :: (a,w),它不接受任何参数作为输入。 runWriter 如何接受一个包含在新类型中的元组,而 return 只是一个简单的元组?

Am I correct in saying that by passing w and a to the Writer type constructor, you get a Writer monad in return,

不,Writer w 是 monad(假设 Monoid w)。 Writer w a 是一种类型。

with this monad only having one function which is the runWriter function?

不,类型 Writer w a 本质上是一对类型 (a,w)。里面没有函数。

你可以假设类型是这样定义的

newtype Writer w a = Writer (a,w)

并且有一个单独的便利 "unwrapping" 函数

runWriter :: Writer w a -> (a,w)
runWriter (Writer p) = p

您可以将这些函数视为互逆函数:

Writer :: (a,w) -> Writer w a        -- "wrapper"
runWriter :: Writer w a -> (a,w)     -- "unwrapper"

data 声明中使用 记录语法 确实定义了带有隐式参数的函数(除了数据类型本身)。 任何类型

data T = MkT { f :: Int, g :: String }

定义数据类型 T、数据构造函数 MkT 和具有隐式 T 参数的函数 fg

f :: T -> Int               -- f (MkT i _) = i
g :: T -> String            -- g (MkT _ s) = s

使用 newtypes 的记录语法以相同的方式工作,除了必须有 one 字段(在您的示例中名为 runWriter) .