我试图找出Haskell中的monad但是还没有走得太远。
我找到了https://en.wikibooks.org/wiki/Haskell/Understanding_monads#cite_note-1 和其他一些教程/解释,但似乎没有解释类型构造函数和返回函数之间的区别。
据我了解
return
函数在基本数据类型的给定值上应用类型构造函数,并返回构造的monad。那么,让两个函数做得基本相同是什么意思?
修改 所以使用Maybe-monad的例子,
country = Just "China"
:(构造函数)为值" China"创建monad。 return "China"
:返回与中国值对应的monad,因此它基本上是包含"China"
值的monad。一般来说,我理解monad是值的容器。 monad的一个用法是将简单/现有计算组合到更复杂的计算中。
答案 0 :(得分:6)
类型构造函数是返回类型的类型级函数。 Maybe
是一个类型构造函数,它接受单个类型参数并返回一个类型,例如Maybe String
,Maybe Int
等。
数据构造函数用于创建特定类型的值。对于某些类型Maybe a
,这些构造函数为Just
和Nothing
,即
data Maybe a = Just a | Nothing
return
函数构造一个' plain'的monadic值。价值,例如
return 1 :: Maybe Int
return "s" :: [String]
所以在Monad
类
class Monad m where
return :: a -> m a
m
是一个类型构造函数,例如(IO
,Maybe
,[]
)用于构造类型,而return
是一个从值构造类型m a
的monadic值的函数类型为a
。
对于Maybe
的monad实例,return
只构造Maybe a
的值。
instance Monad Maybe where
return x = Just x
因此,如果您知道自己正在处理Maybe
,那么您使用的内容并不重要。但是,return
具有更通用的类型,因为它可用于为某些monad m a
构造任意值m
。
答案 1 :(得分:2)
类型构造函数构造其他类型的类型。它不是一种功能,与价值无关。
在Haskell中,[]
是一个类型构造函数。应用于某个类型时,例如Int
,它会生成另一种类型[Int]
。
顺便说一下,在Java []
中也是一个类型构造函数。它可以使用现有类型Int[]
创建新类型Int
。
也许您想问一下数据构造函数。实际上,[]
也是一个数据构造函数(不同于拼写为[]
的类型构造函数),在某些上下文中它等同于return
。那为什么我们需要return
呢? return
适用于任何monad,可用于编写适用于任何monad的通用monadic代码。它是[]
和Just
以及Left
的概括和...
答案 2 :(得分:0)
在
(>>=) :: Monad m => m a -> (a -> m b) -> m b
m
是Monad
类实例的类型的构造函数。m a
不是构造函数应用程序,而是匹配模式以提取m
和a
a->m b
是针对m b
函数的模式。我们称之为k
。>>=
需要映射到k
映射到的内容(“返回”),即应用k a
Maybe
的实现
(Just x) >>= k = k x
在do
>>=
将someMonad <- mConstructorSmartOrNot someParam
绑定到下一行>>
将mConstructorSmartOrNot someParam
绑定到下一行 return :: Monad m => a -> m a
return
与m
基本相同,
但由于m
可以是任何
构造函数(具有m
构造类型的变量的值),
我们通常可以用这个名字来称呼它。
一个monad构建并转发上下文。