了解作者类型

cen*_*980 3 syntax monads haskell functional-programming record

我正在“为哈萨克学到伟大的东西!”一书中学习单子。由Miran Lipovaca撰写。我正在阅读Control.Monad.Writer模块如何将Writer w a类型及其Monad实例以及一些有用的函数导出来处理此类型的值。

对于以下代码:

newtype Writer w a = Writer { runWriter :: (a,w) }
Run Code Online (Sandbox Code Playgroud)

我知道atype参数代表某些值的w类型,而type参数代表附加的monoid值的类型。我在说,通过传递正确waWriter类型构造,你会得到一个作家单子的回报,这个单子只有一个函数在runWriter功能?

在书中说,该runWriter函数采用一个包装在新类型中的元组并对其进行包装Writer,从而返回一个简单的元组。但是,类型声明runWriterrunWriter :: (a,w),它不接受任何参数作为输入。如何runWriter获取包装在新类型中的元组并仅返回简单的元组?

chi*_*chi 5

我在说,通过传递正确wa对作家的类型构造,你得到的回报作家单子,

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

这个单子只有一个功能是哪个runWriter功能?

不,该类型Writer w a实质上是一对类型(a,w)。里面没有功能。

您可以假装通过以下方式定义类型

newtype Writer w a = Writer (a,w)
Run Code Online (Sandbox Code Playgroud)

并且有一个单独的方便的“展开”功能

runWriter :: Writer w a -> (a,w)
runWriter (Writer p) = p
Run Code Online (Sandbox Code Playgroud)

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

Writer :: (a,w) -> Writer w a        -- "wrapper"
runWriter :: Writer w a -> (a,w)     -- "unwrapper"
Run Code Online (Sandbox Code Playgroud)

实际上,在声明中使用记录语法data实际上定义了带有隐式参数的函数(除了数据类型本身之外)。随便哪种

data T = MkT { f :: Int, g :: String }
Run Code Online (Sandbox Code Playgroud)

定义数据类型T,数据的构造MkT和功能fg具有一个隐含的T参数,

f :: T -> Int               -- f (MkT i _) = i
g :: T -> String            -- g (MkT _ s) = s
Run Code Online (Sandbox Code Playgroud)

使用newtypes的记录语法的工作方式相同,只是必须存在一个字段(runWriter在您的示例中名为)。