monad 的类型构造函数和 return 函数之间的区别(在 Haskell 中)
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
和其他几个 tutorials/explanations,但是 none 似乎在解释类型构造函数和 return 函数之间的区别。
据我了解
- 类型构造函数从基本数据类型的给定值构造一个 monad。所以它有点像 Java 中的普通构造函数,它根据给定的参数构建一个新实例。
return
函数对基本数据类型的给定值应用类型构造函数,returns 构造的 monad。
那么让两个功能基本相同有什么意义呢?
编辑
所以使用 Maybe-monad 的例子,
country = Just "China"
:(构造函数)为值 "China" 创建 monad。
return "China"
:return是对应中国值的monad,所以基本上就是"China"
值的monad。
一般来说,我将 monad 理解为值的容器。
monad 的一种用法是将 simple/existing 计算组合成更复杂的计算。
类型构造函数是 return 类型的类型级函数。 Maybe
是一个类型构造函数,它接受一个类型参数,return 是一个类型,例如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
class Monad m where
return :: a -> m a
m
是一个类型构造函数,例如(IO
, Maybe
, []
) 用于构造类型,而 return
是一个函数,它从一个值构造 m a
类型的单子值类型 a
.
对于 Maybe
的 monad 实例,return
构造一个 Maybe a
的值,即
instance Monad Maybe where
return x = Just x
因此,如果您知道自己正在处理 Maybe
,那么使用哪个并不重要。但是,return
具有更通用的类型,因为它可用于为某些 monad m
构造任意值 m a
。
类型构造函数从其他类型构造一个类型。它不是函数,与值无关。
在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
class 实例类型的构造函数
m a
不是构造函数应用程序,而是用于提取 m
和 a
的模式匹配
a->m b
是针对 m b
函数的模式。我们称它为 k
.
>>=
需要映射到 k
映射到 ('returns') 的内容,即应用 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 构造并转发上下文。
我正在尝试找出 Haskell 中的 monad,但还没有走得太远。
我找到了 https://en.wikibooks.org/wiki/Haskell/Understanding_monads#cite_note-1 和其他几个 tutorials/explanations,但是 none 似乎在解释类型构造函数和 return 函数之间的区别。
据我了解
- 类型构造函数从基本数据类型的给定值构造一个 monad。所以它有点像 Java 中的普通构造函数,它根据给定的参数构建一个新实例。
return
函数对基本数据类型的给定值应用类型构造函数,returns 构造的 monad。
那么让两个功能基本相同有什么意义呢?
编辑 所以使用 Maybe-monad 的例子,
country = Just "China"
:(构造函数)为值 "China" 创建 monad。return "China"
:return是对应中国值的monad,所以基本上就是"China"
值的monad。
一般来说,我将 monad 理解为值的容器。 monad 的一种用法是将 simple/existing 计算组合成更复杂的计算。
类型构造函数是 return 类型的类型级函数。 Maybe
是一个类型构造函数,它接受一个类型参数,return 是一个类型,例如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
class Monad m where
return :: a -> m a
m
是一个类型构造函数,例如(IO
, Maybe
, []
) 用于构造类型,而 return
是一个函数,它从一个值构造 m a
类型的单子值类型 a
.
对于 Maybe
的 monad 实例,return
构造一个 Maybe a
的值,即
instance Monad Maybe where
return x = Just x
因此,如果您知道自己正在处理 Maybe
,那么使用哪个并不重要。但是,return
具有更通用的类型,因为它可用于为某些 monad m
构造任意值 m a
。
类型构造函数从其他类型构造一个类型。它不是函数,与值无关。
在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
class 实例类型的构造函数
m a
不是构造函数应用程序,而是用于提取m
和a
的模式匹配
a->m b
是针对m b
函数的模式。我们称它为k
.>>=
需要映射到k
映射到 ('returns') 的内容,即应用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 构造并转发上下文。