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

ama*_*loy 14 haskell applicative

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

f a x ++ f a y
Run Code Online (Sandbox Code Playgroud)

显然这是在现实生活中编写该表达式的最佳方式,因为无论如何我在范围内都有所有这些变量,但是我看到了重复f a,并且认为"嘿,也许你可以用函数的Applicative实例删除它".我结束了:

liftA2 (++) (flip f x) (flip f y) a
Run Code Online (Sandbox Code Playgroud)

这太可怕了.有没有更好的方法来删除这种重复?显然我也可以通过绑定f a到某个东西来删除重复where子句中的,但这是一个使用内置函数的练习.

mel*_*ene 21

你可以做到

((++) `on` f a) x y
Run Code Online (Sandbox Code Playgroud)

Applicative虽然(抱歉),但没有用.


jub*_*0bs 21

[...]也许您可以使用Applicative实例删除它.

你必须使用Applicative实例((->) t)吗?如果你只是想摆脱重复f a,为什么不使用列表monad,而不是?

[x, y] >>= f a
Run Code Online (Sandbox Code Playgroud)

或者,等效地,

f a =<< [x, y]
Run Code Online (Sandbox Code Playgroud)

例:

?> let f :: Int -> Int -> [Int]; f a x = [a .. x]

?> f 1 2 ++ f 1 3
[1,2,1,2,3]

?> [2, 3] >>= f 1
[1,2,1,2,3]

?> f 1 =<< [2, 3]
[1,2,1,2,3]
Run Code Online (Sandbox Code Playgroud)


Dan*_*ner 14

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

(($x) <> ($y)) (f a)
Run Code Online (Sandbox Code Playgroud)