【发布时间】:2020-05-28 13:45:40
【问题描述】:
我有两个组合的应用函子 Maybe [Integer] 并想将它们与 <$>/<*> 结合起来,但我坚持应用应用操作。以下内容不进行类型检查:
(<*>) (<*>) ((<$>) ((+) <$>) $ Just [1,2,3]) $ Just [4,5,6]
预期结果:
Just [5,6,7,6,7,8,7,8,9]
函子部分起作用,即作为第一个参数传递给<*>的中间值是Just [Integer -> Integer]。我习惯了 S 表达式,所以我很难使用 Haskell 语法。我知道Compose,但我对没有抽象的纯粹组合感兴趣。
【问题讨论】:
-
哇,这太混乱了!多层
<*>/<$>只是一团糟。请改用liftA2。 -
或者至少不要尝试使用无点样式。这更清楚:
(liftA2 . liftA2) (+) = \a b -> (\a' b' -> (+) <$> a' <*> b') <$> a <*> b -
如果你真的希望它是免费的,这里有一个由pointfree.io
((<*>) . ((+) <$>)) <$> a <*> b生成的版本 -
@Hjulle:lambda 版本和无点版本都非常适合理解基本原理。谢谢!
-
我现在已将这些 cmets 扩展为更完整的答案
标签: haskell composition applicative