相关疑难解决方法(0)

Haskell Monad绑定运算符混淆

好吧,所以我不是Haskell程序员,但我对Haskell背后的许多想法非常感兴趣,并且我正在研究它.但是我被困在第一个方面:我似乎无法绕过Monads,这似乎是相当基础的.我知道有一百万个关于SO的问题要求解释Monads,所以我会更加具体地说明了什么在困扰我:

我读了这篇优秀的文章(Javascript中的介绍),并认为我完全了解Monads.然后我读了Monads上的维基百科条目,看到了:

多态类型(M t)→(t→M u)→(M u)的绑定操作,其中Haskell由中缀运算符表示>> =.它的第一个参数是monadic类型的值,它的第二个参数是一个函数,它从第一个参数的基础类型映射到另一个monadic类型,其结果是在其他monadic类型中.

好的,在我引用的文章中,bind是一个仅占用一个参数的函数.维基百科说两个.我认为我对Monads的理解如下:

  1. Monad的目的是使用具有不同输入和输出类型的函数并使其可组合.它通过使用单个monadic类型包装输入和输出类型来实现此目的.
  2. Monad由两个相互关联的函数组成:bind和unit.绑定采用不可组合的函数f并返回一个新函数g,它接受monadic类型作为输入并返回monadic类型.g是可组合的.unit函数接受f期望的类型的参数,并将其包装在monadic类型中.然后可以将其传递给g,或者传递给g之类的任何函数组合.

但是肯定有一些错误,因为我的bind概念需要一个参数:一个函数.但是(根据维基百科)Haskell的绑定实际上有两个参数!我的错误在哪里?

monads haskell currying composition function-composition

32
推荐指数
3
解决办法
1万
查看次数

Monad加入功能

虽然monads在Haskell中使用bind和return函数表示,但它们也可以使用join函数进行另一种表示,如此处所述.我知道这个函数的类型是M(M(X)) - > M(X),但这实际上是做什么的?

monads haskell

26
推荐指数
4
解决办法
1万
查看次数

fmap和bind之间的能力差异?

我是函数式编程的新手(来自javascript),我很难分辨两者之间的区别,这也搞砸了我对functor与monads的理解.

仿函数:

class Functor f where
    fmap :: (a -> b) -> f a -> f b
Run Code Online (Sandbox Code Playgroud)

Monad(简化):

class Monad m where
    (>>=) :: m a -> (a -> m b) -> m b
Run Code Online (Sandbox Code Playgroud)
  • fmap 接受函数和仿函数,并返回一个仿函数.
  • >>= 接受一个函数和一个monad,并返回一个monad.

两者之间的区别在于函数参数:

  • fmap - (a -> b)
  • >>= - (a -> m b)

>>=获取一个返回monad的函数参数.我知道这很重要,但是我很难看到这个轻微的东西如何使monad比functor强大得多.谁能解释一下?

monads haskell functional-programming functor

12
推荐指数
2
解决办法
2178
查看次数

Kleisli 类别中的 Monads 有什么特别之处?

相关的问题是

  1. Monads 有什么特别之处?

  2. bind 可以由 fmap 和 join 组成,那么我们是否必须使用 monadic 函数 a -> mb?

在第一个问题中:

Monads 有什么特别之处?

monad 是一种数学结构,在(纯)函数式编程中大量使用,基本上是 Haskell。但是,还有许多其他数学结构可用,例如应用函子、强单子或幺半群。有些更具体,有些更通用。然而,单子更受欢迎。这是为什么?

回答问题的评论:

在我的记忆中,monads 是由 Wadler 普及的,当时没有繁琐的 CPS 进行 IO 和没有显式状态传递的解析的想法是巨大的卖点;这是一个非常激动人心的时刻。AFAIR,Haskell 没有做构造函数类,但是 Gofer(Hugs 之父)做了。Wadler 建议为 monad 重载列表理解,所以后来出现了 do 符号。一旦 IO 成为 monadic,monads 就成为初学者的大事,将它们巩固为一个重要的东西。Applicative 在你可以的时候更好,Arrows 更通用,但它们来得较晚,而且 IO 很难卖 monad。– AndrewC 2013 年 5 月 9 日 1:34

@Conal 的回答是:

我怀疑对这一特定类型类 ( Monad) 的过多关注主要是历史上的侥幸。人们经常将 与 联系IO起来Monad,尽管这两个是独立有用的想法(列表反转和香蕉也是如此)。因为IO是神奇的(有实现但没有外延)并且Monad通常与 相关联IO,所以很容易陷入神奇的思考中Monad

首先,我同意他们的观点,我认为Monads的用处主要来自Functors,我们可以在结构中嵌入许多函数,而Monads是通过join …

javascript monads haskell functional-programming

-3
推荐指数
1
解决办法
857
查看次数