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

我试图找出Haskell中的单子,但没有太多。

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

据我了解

  • 类型构造函数根据基本数据类型的给定值构造monad。 所以它就像Java中的一个普通构造器,它从给定的参数构建一个新的实例。
  • return函数将类型构造函数应用于基本数据类型的给定值并返回构造的monad。
  • 那么有两个基本相同的功能有什么意义呢?

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

  • country = Just "China" :(建设者)为价值“中国”创造monad。
  • return "China" :返回与中国价值对应的单子,所以它基本上是含有"China"价值的单子。
  • 一般来说,我理解一个monad是价值的容器。 monads的一种用法是将简单/现有的计算结合到更复杂的计算中。


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

    数据构造函数用于创建特定类型的值。 对于某些类型Maybe a这些构造函数是JustNothing 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是一个类型构造函数,例如( IOMaybe[] )用于构造类型,而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代码。 这是[]JustLeft的泛化...

    链接地址: http://www.djcxy.com/p/7509.html

    上一篇: Difference between type constructor and return function of a monad (in Haskell)

    下一篇: Termination checking in functional programs