我正在为其他人的Stack Overflow问题玩一个简单的函数,并编写了表达式:
f a x ++ f a y
显然这是在现实生活中写出这个表达式的最好方法,因为无论如何我在范围内都有这些变量,但是我看到了f a
的重复,并且想到了“嘿,也许你可以删除它功能的应用实例“。我结束了:
liftA2 (++) (flip f x) (flip f y) a
这太糟糕了。有没有更好的方法来删除这种重复?显然我也可以通过将f a
绑定到where
子句中的某些内容来删除重复,但这是用来使用内置函数的练习。 / p>
答案 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)