了解作者类型
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
类型参数表示附加的幺半群值的类型。我说的对吗,通过将 w
和 a
传递给 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
参数的函数 f
、g
、
f :: T -> Int -- f (MkT i _) = i
g :: T -> String -- g (MkT _ s) = s
使用 newtype
s 的记录语法以相同的方式工作,除了必须有 one 字段(在您的示例中名为 runWriter
) .
我正在阅读 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
类型参数表示附加的幺半群值的类型。我说的对吗,通过将 w
和 a
传递给 Writer
类型构造函数,您在 return 中得到了一个 Writer monad,这个 monad 只有一个函数是runWriter
函数?
在书中它说 runWriter
函数接受一个包装在 Writer
新类型中的元组并将其解包,returning 一个简单的元组。但是 runWriter
的类型声明是 runWriter :: (a,w)
,它不接受任何参数作为输入。 runWriter
如何接受一个包含在新类型中的元组,而 return 只是一个简单的元组?
Am I correct in saying that by passing
w
anda
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
参数的函数 f
、g
、
f :: T -> Int -- f (MkT i _) = i
g :: T -> String -- g (MkT _ s) = s
使用 newtype
s 的记录语法以相同的方式工作,除了必须有 one 字段(在您的示例中名为 runWriter
) .