首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Haskell monad改为monad

Haskell monad改为monad
EN

Stack Overflow用户
提问于 2017-11-30 01:52:03
回答 2查看 116关注 0票数 1

有方法(>>=) :: forall a b. m a -> (a -> m b) -> m b。我如何使方法:: forall a b. m (n a) -> (a -> m (n b)) -> m (n b),其中m和n是单。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-30 14:41:48

正如PyRulez所写的,对此没有通用的解决方案,但是考虑到您报告的类型,下面这样的内容应该可以工作。

你需要

代码语言:javascript
复制
import Control.Monad (join)

使用do符号,您可以组成两个函数,foobar,如下所示:

代码语言:javascript
复制
comp :: (a -> TargetClient (MethodResult b)) ->
        (b -> TargetClient (MethodResult c)) ->
         a -> TargetClient (MethodResult c)
comp foo bar x = do
  f <- foo x
  b <- join <$> traverse bar f
  return b

如果您不喜欢do表示法,可以将其全部简化为:

代码语言:javascript
复制
comp' :: (a -> TargetClient (MethodResult b)) ->
         (b -> TargetClient (MethodResult c)) ->
          a -> TargetClient (MethodResult c)
comp' foo bar x = foo x >>= fmap join . traverse bar

当您用f映射bar时,可以这样说,您将按错误的顺序堆放单块,但是您可以使用traverse来切换堆栈。即使这样做,Either中也会有一个join,这就是需要join的原因。

票数 0
EN

Stack Overflow用户

发布于 2017-11-30 16:53:16

如果mn都是monad,那么还需要一个额外的部分来使复合m.n也是一个单子。

需要的是一种“分布规律”,这是一种自然的态射forall a . n(m a) -> m(n a) (参见这里,它来自贝克,也用于街道)

然后,就可以很容易地写出缺失的部分,并验证它是否满足单一定律。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47564655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档