monad的类型构造函数和返回函数之间的区别(在Haskell中)
我试图找出Haskell中的单子,但没有太多。
我发现https://en.wikibooks.org/wiki/Haskell/Understanding_monads#cite_note-1和其他几个教程/解释,但似乎没有解释类型构造函数和返回函数之间的区别。
据我了解
return
函数将类型构造函数应用于基本数据类型的给定值并返回构造的monad。 那么有两个基本相同的功能有什么意义呢?
编辑所以使用一个Maybe-monad的例子,
country = Just "China"
:(建设者)为价值“中国”创造monad。 return "China"
:返回与中国价值对应的单子,所以它基本上是含有"China"
价值的单子。 一般来说,我理解一个monad是价值的容器。 monads的一种用法是将简单/现有的计算结合到更复杂的计算中。
类型构造函数是返回类型的类型级函数。 Maybe
是一个类型构造函数,它接受一个单一的类型参数并返回一个类型,例如Maybe String
, Maybe Int
等。
数据构造函数用于创建特定类型的值。 对于某些类型Maybe a
这些构造函数是Just
和Nothing
ie
data Maybe a = Just a | Nothing
return
函数从“简单”值构造一个monadic值,例如
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[]
。
也许你想问一下数据构造函数。 的确, []
也是一个数据构造函数(不同于类型构造函数spelled []
),在某些上下文中它等价于return
。 为什么我们需要return
呢? return
适用于任何monad,可用于编写适用于任何monad的通用monadic代码。 这是[]
和Just
和Left
的泛化...
上一篇: Difference between type constructor and return function of a monad (in Haskell)