【发布时间】:2018-03-29 20:43:03
【问题描述】:
我最近在Exercism 为ISBN Verifier 练习编写了一个解决方案,当我通过pointfree.io 运行这个函数时:
\c -> isDigit c || c == 'X'
我回来了:
liftM2 (||) isDigit ('X' ==)
为什么pointfree.io从Control.Monad选择liftM2而不是从Control.Applicative选择liftA2?
【问题讨论】:
-
pointfree.io是一个有趣的玩具,仅此而已。它不应该以任何方式给出好的建议,它只是暗示什么是可能的。 -
我很惊讶它选择了
('X' ==)而不是(== 'X')。显然这种转置是“安全的”,因为(==)应该是对称的,但为什么不直接选择精确的转换呢? -
@amalloy 我无法回答为什么该工具会这样做,但这是我在编写部分应用程序时会注意的事情。根据经验,首先应用较早的参数会更好,因为精心编写的函数在给定第一个参数时可能会比在 lambda 下使用时共享更多的计算。例如想象一下,如果
(==)首先比较每个参数的一些昂贵的统计数据,然后继续进行其他一些比较;那么map (foo==) bar可能比map (==foo) bar更有效,因为前者只计算了一次foo的统计数据。
标签: haskell monads functor applicative