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 函数之间的区别。

据我了解

那么让两个功能基本相同有什么意义呢?

编辑 所以使用 Maybe-monad 的例子,

一般来说,我将 monad 理解为值的容器。 monad 的一种用法是将 simple/existing 计算组合成更复杂的计算。

类型构造函数是 return 类型的类型级函数。 Maybe 是一个类型构造函数,它接受一个类型参数,return 是一个类型,例如Maybe StringMaybe Int

数据构造函数用于创建特定类型的值。对于某些类型 Maybe a 这些构造函数是 JustNothing

data Maybe a = Just a | Nothing

return 函数从 'plain' 值构造一个 monadic 值,例如

return 1 :: Maybe Int
return "s" :: [String]

所以在定义中Monadclass

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
  • mMonad class
  • 实例类型的构造函数
  • m a 不是构造函数应用程序,而是用于提取 ma
  • 的模式匹配
  • 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

returnm基本相同, 但是因为 m 可以是任何 构造函数(m 构造类型变量的值), 我们可以用这个名字来泛指。

Monad 构造并转发上下文。