删除重复(使用Applicative(( - >)t),也许?)

时间:2015-09-30 20:06:24

标签: haskell applicative

我正在为其他人的Stack Overflow问题玩一个简单的函数,并编写了表达式:

f a x ++ f a y

显然这是在现实生活中写出这个表达式的最好方法,因为无论如何我在范围内都有这些变量,但是我看到了f a的重复,并且想到了“嘿,也许你可以删除它功能的应用实例“。我结束了:

liftA2 (++) (flip f x) (flip f y) a

这太糟糕了。有没有更好的方法来删除这种重复?显然我也可以通过将f a绑定到where子句中的某些内容来删除重复,但这是用来使用内置函数的练习。 / p>

4 个答案:

答案 0 :(得分:21)

你可以做到

((++) `on` f a) x y

虽然(抱歉),但不使用Applicative

答案 1 :(得分:21)

  

[...]也许您可以使用适用于函数的实例删除它。

您是否必须使用Applicative的{​​{1}}实例?如果你只是想摆脱重复的((->) t),为什么不使用列表monad呢?

f a

或等同地

[x, y] >>= f a

示例:

f a =<< [x, y]

答案 2 :(得分:14)

Bikeshedding很有趣!另一种选择是将Monoid实例用于函数:

(($x) <> ($y)) (f a)

答案 3 :(得分:3)

由于问题暗示使用Applicative的解决方案(虽然其他答案更优雅)......

((++) <$> ($ x) <*> ($ y)) (f a)