繁体   English   中英

monad 的类型构造函数和返回函数之间的区别(在 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和其他几个教程/解释,但似乎没有解释类型构造函数和返回函数之间的区别。

正如我所理解的

  • 类型构造函数从基本数据类型的给定值构造一个 monad。 所以它有点像 Java 中的普通构造函数,它从给定的参数构建一个新实例。
  • return函数对基本数据类型的给定值应用类型构造函数并返回构造的 monad。

那么让两个函数做基本相同的事情有什么意义呢?

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

  • country = Just "China" : (构造函数) 为值 "China" 创建 monad。
  • return "China" : 返回对应于China值的monad,所以基本上就是包含"China"值的monad。

一般来说,我将 monad 理解为值的容器。 monad 的一种用法是将简单/现有的计算与更复杂的计算结合起来。

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

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

data Maybe a = Just a | Nothing

return函数从“普通”值构造一元值,例如

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

所以在Monad类的定义中

class Monad m where
  return :: a -> m a

m是一个类型构造器,例如 ( IO , Maybe , [] ) 用于构造类型,而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[]

也许您想询问有关数据构造函数的问题。 事实上, []也是一个数据构造函数(不同于拼写为[]的类型构造函数)并且在某些上下文中它等价于return 那我们为什么需要return呢? return适用于任何 monad,可用于编写适用于任何 monad 的通用 monadic 代码。 它是[]JustLeft和...的概括

  (>>=) :: Monad m => m a -> (a -> m b) -> m b
  • m是一个类型的构造函数,它是Monad类的实例
  • ma不是构造函数应用程序,而是用于提取ma的模式匹配
  • a->mb是针对mb函数的模式。 我们称之为k
  • >>=需要映射到k映射到的('返回'),即应用ka

来自Maybe的实现

    (Just x) >>= k      = k x

do

  • >>=someMonad <- mConstructorSmartOrNot someParam到下一行
  • >>mConstructorSmartOrNot someParam绑定到下一行
    return :: Monad m => a -> m a

return是基本相同m ,但由于m能(一个的变量的值的任何构造m -constructed类型),我们可以参考它通常与这一个名称。

monad 构造并转发上下文。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM