【问题标题】:Haskell-function composition ((<*>) . (<*>))Haskell 函数组合 ((<*>) . (<*>))
【发布时间】:2018-04-13 12:54:40
【问题描述】:
    ((<*>) . (<*>))
    --In GHCi
    :: (a1 -> a2 -> b) -> ((a1 -> a2) -> a1) -> (a1 -> a2) -> b

为什么是这种类型?怎么会进化成这样的类型?

    :t ((<*>) .)

    ((<*>) .)
      :: Applicative f => (a1 -> f (a2 -> b)) -> a1 -> f a2 -> f b

    :t (. (<*>))
    (. (<*>))
      :: Applicative f => ((f a -> f b) -> c) -> f (a -> b) -> c

    ((<*>) . (<*>))
    --from left to right
  1. (&lt;*&gt;) :: Applicative f1 =&gt; f1 (a1 -&gt; b1) -&gt; f1 a1 -&gt; f1 b1;
  2. (.) :: (b -&gt; c) -&gt; (a -&gt; b) -&gt; a -&gt; c;
  3. (&lt;*&gt;) :: Applicative f2 =&gt; f2 (a2 -&gt; b2) -&gt; f2 a2 -&gt; f2 b2;

2.(a -&gt; b),让3. f2 (a2 -&gt; b2) = a;因此,b 应为f2 a2 -&gt; f2 b2(b -&gt; c),替换为1.bf1 (a1 -&gt; b1)c 应为f1 a1 -&gt; f1 b1

但是,b 应该彼此相等,f2 a2 -&gt; f2 b2 = f1 (a1 -&gt; b1) ?如何使两者相互适应 在 GHCi 中,它似乎将f (a -&gt; b) 替换为a1a2,那么它的进展如何?

【问题讨论】:

  • 为什么是这种类型”是什么意思?
  • 记住(-&gt;) aApplicative
  • 感谢您的评论,我知道这是一个 Applicative,它对改进作文有什么帮助?

标签: haskell function-composition


【解决方案1】:

据我所知,你的推理是正确的。

正如你所写,下一步是解决

f2 a2 -> f2 b2 = f1 (a1 -> b1)

在前缀表示法中,

(->) (f2 a2) (f2 b2) = f1 (a1 -> b1)

这意味着

(->) (f2 a2) = f1
f2 b2 = a1 -> b1 = (->) a1 b1

所以,

(->) (f2 a2) = f1
f2 = (->) a1
b2 = b1

我想你可以从这里继续。请记住将x -&gt; y 解释为(-&gt;) x y


利用上述内容,加上您对ac 的发现,我们得到:

a = f2 (a2 -> b2) 
  = (->) a1 (a2 -> b2)
  = a1 -> a2 -> b2
  = a1 -> a2 -> b1

c = f1 a1 -> f1 b1
  = (->) (f2 a2) a1 -> (->) (f2 a2) b1
  = (f2 a2 -> a1) -> (f2 a2 -> b1)
  = ((->) a1 a2 -> a1) -> ((->) a1 a2 -> b1)
  = ((a1 -> a2) -> a1) -> (a1 -> a2) -> b1

a -> c =
  = (a1 -> a2 -> b1) -> ((a1 -> a2) -> a1) -> (a1 -> a2) -> b1

这是原始类型(这里将b 重命名为b1)。

【讨论】:

  • 感谢您的帮助,那之后我们该怎么做,您有什么建议吗?
  • 我想应该有一些数学方面的定理(lambda演算)来处理 f(a->b) 和 f a -> f b 的东西。类似于结构分配律。我不确定... :-(
  • @CLQ0728 您只需要替换所有内容。请参阅上面的编辑。
  • 非常感谢??
猜你喜欢
  • 2016-04-30
  • 2010-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多