当前位置: 首页 > 知识库问答 >
问题:

函数单子真的提供了比函数应用函子更多的东西吗?如果是,什么?

蒋茂材
2023-03-14

对于函数单子,我发现(<*>)(>>=)/(=<<)有两种惊人相似的类型。特别是(=<<)使相似性更加明显:

(<*>) :: (r -> a -> b) -> (r -> a) -> (r -> b)
(=<<) :: (a -> r -> b) -> (r -> a) -> (r -> b)
f <*> g = \x -> f x (g x)
f =<< g = \x -> f (g x) x 

而且它们看起来是如此惊人的相似(或者对称,如果你想的话),以至于我不禁想起了标题中的问题。

关于单子比应用函子“更强大”的问题,在Lyah的《多几个单子》一章的硬拷贝中,有如下陈述:

[…]join不能仅仅通过使用函数和应用程序提供的功能来实现。

我能用(<*>)来表达吗?嗯,实际上我认为我可以:flip($)<*>f===joinf不是正确的吗?Flip($)<*>F不是不使用(>>=)/(=<<)returnjoin的实现吗?

但是,考虑一下列表应用程序/Monad,我可以表达join而不显式使用(=<<)/(>>=)return(甚至不使用(<*>),fwiw):join=concat;因此,实现join f=flip($)<*>f可能也是一种技巧,它并不能真正显示出我是仅仅依赖于applicative还是也依赖于monad

共有1个答案

岳浩穰
2023-03-14

当您这样实现join时,您所使用的函数类型知识超出了applicative所提供的知识。这些知识通过使用($)进行编码。这就是“application”运算符,它是函数even的核心。列表示例也发生了同样的情况:您使用了concat,它基于对列表性质的了解。

一般说来,如果你能使用一个特殊单子的知识,你就能表示任何幂的计算。例如,使用maybe您可以匹配它的构造函数并以这种方式表达任何内容。当LYAH说单子比应用更强大时,它的意思是“作为抽象”,而不是应用于任何特定的单子。

 类似资料:
  • 如果是的话,那为什么我们到处都是用Java8进行函数式编程的文章呢?

  • 我刚刚开始学习Node,我正在尝试使用Node和Express构建一个Web应用程序。我的app.js文件中有以下代码,具有以下目录结构。 目录结构: -js公司- 运行命令node app并转到localhost:3000后。我得到以下错误。我想它不喜欢这一行的字符串- 错误消息: TypeError:字符串不是函数在Fnode_modules(C:\myapp\Express\node_mod

  • 我用这篇文章作为例子(React way),但它对我不起作用。请指出我的错误,因为我不明白出了什么问题。 这就是我看到的错误: 错误:this.props.on点击不是一个函数 这是我的密码: 提前谢谢!

  • 我对函子、应用函子和单子的理解如下: null 两个解析器和的效果并不独立,因为它们都使用来自相同输入流的令牌,例如。 只能使用尚未使用的内容。那么,怎么能说这两种计算是独立的呢?

  • 我有两种不同类型的用户;让我们称它们为和。 我得到了容器中的user type的值,该容器具有实例: 现在我想映射这个值(使用functor实例),将包含的< code>BasicUser转换为< code>EnrichedUser用户,保留在容器中: 然而,< code>enrichUser并不返回< code > enrich user ,而是返回< code>OptionT[Future,e

  • 最后,我没有看到这里的等价或延伸。Monad是一种不同的风格,在另一个故事中很有用。 抱歉我的无知。