类型构造函数和monad的返回函数之间的区别(在Haskell中)

时间:2016-03-24 17:22:21

标签: haskell monads

我试图找出Haskell中的monad但是还没有走得太远。

我找到了https://en.wikibooks.org/wiki/Haskell/Understanding_monads#cite_note-1 和其他一些教程/解释,但似乎没有解释类型构造函数和返回函数之间的区别。

据我了解

  • type constructor根据基本数据类型的给定值构造monad。所以它是像Java一样的普通构造函数,它从给定参数构建一个新实例。
  • return函数在基本数据类型的给定值上应用类型构造函数,并返回构造的monad。

那么,让两个函数做得基本相同是什么意思?

修改 所以使用Maybe-monad的例子,

  • country = Just "China" :(构造函数)为值" China"创建monad。
  • return "China":返回与中国值对应的monad,因此它基本上是包含"China"值的monad。

一般来说,我理解monad是值的容器。 monad的一个用法是将简单/现有计算组合到更复杂的计算中。

3 个答案:

答案 0 :(得分:6)

类型构造函数是返回类型的类型级函数。 Maybe是一个类型构造函数,它接受单个类型参数并返回一个类型,例如Maybe StringMaybe Int等。

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

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是一个类型构造函数,例如(IOMaybe[])用于构造类型,而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
  • mMonad类实例的类型的构造函数。
  • m a不是构造函数应用程序,而是匹配模式以提取ma
  • 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

returnm基本相同, 但由于m可以是任何 构造函数(具有m构造类型的变量的值), 我们通常可以用这个名字来称呼它。

一个monad构建并转发上下文。