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)