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值的类型。我在说,通过传递正确w和a对Writer类型构造,你会得到一个作家单子的回报,这个单子只有一个函数在runWriter功能?
在书中说,该runWriter函数采用一个包装在新类型中的元组并对其进行包装Writer,从而返回一个简单的元组。但是,类型声明runWriter为runWriter :: (a,w),它不接受任何参数作为输入。如何runWriter获取包装在新类型中的元组并仅返回简单的元组?
我在说,通过传递正确
w和a对作家的类型构造,你得到的回报作家单子,
不,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和功能f,g具有一个隐含的T参数,
f :: T -> Int -- f (MkT i _) = i
g :: T -> String -- g (MkT _ s) = s
Run Code Online (Sandbox Code Playgroud)
使用newtypes的记录语法的工作方式相同,只是必须存在一个字段(runWriter在您的示例中名为)。