[英]Difference between type constructor and return function of a monad (in Haskell)
我试图找出 Haskell 中的 monad,但还没有走得太远。
我找到了https://en.wikibooks.org/wiki/Haskell/Understanding_monads#cite_note-1和其他几个教程/解释,但似乎没有解释类型构造函数和返回函数之间的区别。
正如我所理解的
return
函数对基本数据类型的给定值应用类型构造函数并返回构造的 monad。那么让两个函数做基本相同的事情有什么意义呢?
编辑所以使用一个Maybe-monad的例子,
country = Just "China"
: (构造函数) 为值 "China" 创建 monad。return "China"
: 返回对应于China值的monad,所以基本上就是包含"China"
值的monad。一般来说,我将 monad 理解为值的容器。 monad 的一种用法是将简单/现有的计算与更复杂的计算结合起来。
类型构造函数是返回类型的类型级函数。 Maybe
是一个类型构造函数,它接受一个类型参数并返回一个类型,例如Maybe String
、 Maybe Int
等。
数据构造函数用于创建特定类型的值。 对于某些类型, Maybe a
这些构造函数是Just
和Nothing
ie
data Maybe a = Just a | Nothing
return
函数从“普通”值构造一元值,例如
return 1 :: Maybe Int
return "s" :: [String]
所以在Monad
类的定义中
class Monad m where
return :: a -> m a
m
是一个类型构造器,例如 ( IO
, Maybe
, []
) 用于构造类型,而return
是一个函数,它从 a 类型a
值构造ma
类型的 monadic 值。
对于Maybe
的 monad 实例, return
构造了一个Maybe a
的值,只用 ie
instance Monad Maybe where
return x = Just x
所以如果你知道你正在处理Maybe
你使用哪个并不重要。 但是, return
具有更通用的类型,因为它可以用于为某些 monad m
构造任意值ma
。
类型构造函数从其他类型构造一个类型。 它不是函数,与值无关。
在 Haskell 中, []
是一个类型构造函数。 当应用于一种类型时,比如Int
,它会生成另一种类型[Int]
。
顺便说一句,在 Java 中[]
也是一个类型构造函数。 它可以从现有类型Int
创建一个新类型Int[]
。
也许您想询问有关数据构造函数的问题。 事实上, []
也是一个数据构造函数(不同于拼写为[]
的类型构造函数)并且在某些上下文中它等价于return
。 那我们为什么需要return
呢? return
适用于任何 monad,可用于编写适用于任何 monad 的通用 monadic 代码。 它是[]
和Just
、 Left
和...的概括。
在
(>>=) :: Monad m => m a -> (a -> m b) -> m b
m
是一个类型的构造函数,它是Monad
类的实例ma
不是构造函数应用程序,而是用于提取m
和a
的模式匹配a->mb
是针对mb
函数的模式。 我们称之为k
。>>=
需要映射到k
映射到的('返回'),即应用ka
来自Maybe
的实现
(Just x) >>= k = k x
在do
>>=
将someMonad <- mConstructorSmartOrNot someParam
到下一行>>
将mConstructorSmartOrNot someParam
绑定到下一行 return :: Monad m => a -> m a
return
是基本相同m
,但由于m
能(一个的变量的值的任何构造m
-constructed类型),我们可以参考它通常与这一个名称。
monad 构造并转发上下文。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.