【发布时间】:2020-11-21 05:38:05
【问题描述】:
In GHC.Base the description of <**> runs:
<*>的变体,参数颠倒。
众所周知,这种情况下的“反转”并不意味着“翻转”为:
GHCi> [1, 2, 3] <**> [(^2), (+1)]
[1,2,4,3,9,4]
GHCi> [(^2), (+1)] <*> [1, 2, 3]
[1,4,9,2,3,4]
那么,“反转”是什么意思?
旁注:有应用函子有(<**>) = flip (<*>)。例如,这是我给读者 ((->) e) 的证明:
(->) e: f <**> g =
= liftA2 (flip ($)) f g =
= (flip ($) <$> f) <*> g =
= \e -> ((flip ($) . f) e) (g e) =
= \e -> flip ($) (f e) $ (g e) =
= \e -> (g e) $ (f e) =
= \e -> g e (f e) =
= g <*> f. => (<**>) = flip (<*>).
【问题讨论】:
-
旁注:
(<**>) = flip (<*>)这样的函子被称为可交换应用函子(或可交换单子,如果它们恰好也是单子)。 -
可能更好的描述可能是“
<*>的变体,参数的角色颠倒了。” -
@WillNess 同意了。说实话,我会进一步写下
<*>和<**>之间的某种关系,例如:xf <**> ff = (&) <$> xf <*> ff。它还会为定义增加更多的间隙,因为右手 IS 定义,只是就<*>,而不是liftA2:liftA2 f xf yf = f <$> xf <*> yf。 -
有些像
liftA2更好;(<*>) = liftA2 ($)和(<**>) = liftA2 (&)非常漂亮和清晰。和短。 :)
标签: haskell operators terminology applicative