【问题标题】:Composing applicative functions [closed]编写应用函数[关闭]
【发布时间】:2015-07-12 16:19:56
【问题描述】:

请实现功能:

composeApplicative :: (Applicative f) => f (b -> c) -> f (a -> b) -> f (a -> c)

这样:

(composeApplicative f g) <*> x == f <*> (g <*> x)

或者,解释为什么不能这样做?

【问题讨论】:

  • composeApplicative p q = (.) &lt;$&gt; p &lt;*&gt; q
  • 这是作业吗?你试过什么?
  • 我投票决定将此问题作为离题结束,因为它可能是家庭作业,而 OP 没有表现出任何努力。
  • @Clinton 那么,展示您尝试过的内容并以表达您遇到问题的方式陈述您的问题,而不是简单地要求代码,这会不会如此困难。你投了反对票是因为你在这个问题上投入的精力太少了。
  • @Clinton 您可能会这么说,但您被否决的事实表明 这是个坏主意。请努力提出一个问题。

标签: haskell functor applicative function-composition


【解决方案1】:

可以做到:

composeApplicative p q = (.) <$> p <*> q

欲了解更多信息,read the documentation for Applicative functors,更具体地说,构图法。这实际上是一个声明,任何Applicative 实例composeApplicative f g &lt;*&gt; x 必须始终等于f &lt;*&gt; (g &lt;*&gt; x)

作为一个小技术说明,在进行等式推理时,等式的左右两边必须用一个等号分隔 (=)。双等号 (==) 为 decidable runtime equality checks 保留。

【讨论】:

  • "作为一个小技术说明,在进行等式推理时,等式的左右两边必须用一个等号 (=) 分隔。双等号 (== ) 保留用于可判定的运行时相等性检查。"这不是一个共识规则;许多知名的 Haskeller 使用== 进行等式推理。甚至 GHC 文档也没有始终如一地遵循它。参见例如the docs for Functor and Monad.
  • @LuisCasillas:点了。但我认为区分作为 proposition 的平等(可能是也可能不是可判定的)和平等的 decision procedure (通常不存在任意类型)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-15
  • 1970-01-01
  • 2017-03-19
  • 1970-01-01
  • 2011-04-10
  • 1970-01-01
相关资源
最近更新 更多