【发布时间】:2011-12-19 23:23:40
【问题描述】:
好的,所以我不是 Haskell 程序员,但我对 Haskell 背后的许多想法非常感兴趣,并且正在学习它。但我被困在第一方:我似乎无法围绕 Monads,这似乎是相当基本的。我知道关于 SO 有上百万个问题要求解释 Monads,所以我将更具体地说明困扰我的问题:
我阅读了这篇出色的文章 (an introduction in Javascript),并认为我完全理解了 Monads。然后我阅读了关于 Monads 的 Wikipedia 条目,看到了这个:
多态类型(M t)→(t→M u)→(M u)的绑定操作,Haskell用中缀运算符>>=表示。 它的第一个参数是一个单子类型的值,它的第二个参数是一个从第一个参数的基础类型映射到另一个单子类型的函数,其结果是另一个单子类型。
好的,在我引用的那篇文章中,bind 是一个只接受 一个 参数的函数。维基百科说两个。我认为我对 Monads 的理解如下:
- Monad 的目的是获取具有不同输入和输出类型的函数并使其可组合。它通过使用单个 monadic 类型包装输入和输出类型来做到这一点。
- Monad 由两个相互关联的函数组成:绑定和单元。 Bind 接受一个不可组合的函数 f 并返回一个新函数 g ,该函数接受单子类型作为输入并返回单子类型。 g 是可组合的。 unit 函数接受 f 期望的类型的参数,并将其包装在 monadic 类型中。然后可以将其传递给 g,或像 g 这样的任何函数组合。
但肯定有什么问题,因为我的绑定概念有一个参数:一个函数。但是(根据维基百科)Haskell 的绑定实际上需要 两个 参数!我的错在哪里?
【问题讨论】:
-
想想如果将参数的顺序翻转为
>>=并将其视为柯里化函数会发生什么。=<<接受一个函数f,并返回一个函数(f =<<),它接受一元值... -
Monads 不是基本的。
-
@ephemient:这不是更偏应用而不是柯里化吗?
-
@ivanm:currying 是启用部分应用的转换的名称。他们是一样的。在 Haskell 中,通常以柯里化形式编写多个参数的函数,因此您通常不会注意到这种等价性。
-
Monads 更像方形 14(Real World Haskell,第 14 章 book.realworldhaskell.org/read)
标签: haskell monads composition currying function-composition