相关疑难解决方法(0)

使用Join()而不是Bind()的Monads

Monad通常用return和来解释bind.不过,我猜想你也可以实现bind在以下方面join(和fmap?)

在缺乏一流功能的编程语言中,使用起来bind非常难以捉摸.join另一方面,看起来很容易.

但是,我并不完全确定我理解它是如何join运作的.显然,它有[Haskell]类型

join :: Monad m => m (m x) -> m x

对于monad列表,这显然很简单concat.但是对于一般的monad来说,这种方法在操作上实际上做了什么?我看到它对类型签名的作用,但我试图弄清楚我是如何在Java或类似的东西中写出这样的东西.

(实际上,这很容易:我不会.因为仿制药已经坏了.;-)但原则问题仍然存在......)


哎呀.看起来之前有人问过:

Monad加入功能

可能有人勾画出使用普通的单子一些实现return,fmapjoin?(即,根本没有提到>>=.)我想也许这可能有助于它沉入我愚蠢的大脑......

monads haskell

62
推荐指数
6
解决办法
1万
查看次数

什么时候应该使用 Kleisli?

我最近偶然发现了 Kleisli 的概念,我阅读的每个教程/链接/参考都通过以下结构激发了 Kleisli 的使用:

  1. 组合返回 monad 的函数f: a -> m[b]with g: b -> m[c]- 我认为monad 的定义已经捕捉到了这种情况 -do/bind/for/flatMap这样做。人们不必依靠 Kleisli 构造来实现这一目标。所以这不可能是 Kleisli IMO 的“主要”用例。
  2. 插入配置:该配置指出,如果多个对象(类型、案例/数据类等)需要Config 注入,则可以使用 Kleisli 构造来抽象出可重复注入。有很多方法可以实现这一点(例如implicit在 Scala 中使用s),可能不需要调用 Kleisli。同样,IMO 这并没有作为“主要”用例脱颖而出。
  3. Monad Transformers:我对此没有深入的理解,但这是我的解释:如果您需要“组合 monad”,您需要一个允许您参数化 monad 本身的构造。例如M1[M2[M1[M2[a]]]],可以转化成[M1[M2[a]]](I可能是错误的)来跨越一元边界压扁是可组合与a -> M3[b](比方说)。为此我们可以使用 Kleisli 三元组并调用该构造,因为如果您要从头开始,您可能会重新发明Kleisli。似乎是证明使用 Kleisli 合理的一个很好的候选者。这样对吗? …

monads haskell functional-programming scala

35
推荐指数
2
解决办法
1722
查看次数

monad绑定(>> =)运算符更接近函数组合(链接)或函数应用程序吗?

在许多文章中我都读过monad >>=运算符是一种表示函数组合的方法.但对我来说,它更接近某种高级功能应用程序

($)   :: (a -> b) -> a -> b
(>>=) :: Monad m => m a -> (a -> m b) -> m b
Run Code Online (Sandbox Code Playgroud)

对于我们的构图

(.)   :: (b -> c) -> (a -> b) -> a -> c
(>=>) :: Monad m => (a -> m b) -> (b -> m c) -> a -> m c
Run Code Online (Sandbox Code Playgroud)

请澄清.

monads haskell functional-programming bind category-theory

18
推荐指数
2
解决办法
2797
查看次数

为什么在monad中使用这种特殊的函数类型?

Haskell的新手,我正试图找出这个Monad的东西.monadic绑定运算符 - >>=具有非常奇特的类型签名:

(>>=) :: Monad m => m a -> (a -> m b) -> m b
Run Code Online (Sandbox Code Playgroud)

为了简化,我们替换Maybem:

(>>=) :: Maybe a -> (a -> Maybe b) -> Maybe b
Run Code Online (Sandbox Code Playgroud)

但请注意,该定义可以用三种不同的方式编写:

(>>=) :: Maybe a -> (Maybe a -> Maybe b) -> Maybe b
(>>=) :: Maybe a -> (      a -> Maybe b) -> Maybe b
(>>=) :: Maybe a -> (      a ->       b) -> Maybe b
Run Code Online (Sandbox Code Playgroud)

在这三个中,中心的一个是最不对称的.但是,据我所知,如果我们想避免(LYAH称为样板代码),第一个有点无意义.但是,接下来的两个,我更喜欢最后一个.对于 …

monads haskell types typeclass

17
推荐指数
2
解决办法
868
查看次数