gpt4 book ai didi

haskell - 了解作家类型

转载 作者:行者123 更新时间:2023-12-02 07:40:03 25 4
gpt4 key购买 nike

我正在《Learn You a Haskell for Great Good!》一书中学习 monad。作者:米兰·利波瓦卡。我正在阅读有关 Control.Monad.Writer 模块如何导出 Writer w a 类型及其 Monad 实例以及一些用于处理此类型值的有用函数的内容。

对于以下代码:

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

我知道 a 类型参数代表某个值的类型,而 w 类型参数代表附加的幺半群值的类型。我是否正确地说,通过将 wa 传递给 Writer 类型构造函数,您将获得一个 Writer monad 作为返回,仅包含此 monad有一个函数是 runWriter 函数吗?

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

最佳答案

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)

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

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和函数f , g有一个隐含的T论证,

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

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

关于haskell - 了解作家类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57356609/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com