有幾個基本的慣用combinators反覆彈出,並重新實現了各種高級概念和庫,但實質上非常簡單。名稱可能會有所不同,而在其他方面有些是可實現的:
fork (f,g) x = (f x, g x) -- == (f &&& g)
prod (f,g) x = (f $ fst x, g $ snd x) -- == (f *** g)
pmap f (x,y) = (f x, f y) -- == (f *** f)
dup x = (x,x)
等。當然uncurry f (x,y) == f x y
中被使用了很多與這些了。
&&&
和***
在Control.Arrow
定義,以及first
和second
。然後prod (f,id) == first f
,prod(id,g) == second g
等等,等等
所以你foobar
變得
foobar = (\(a,b)->[a,b]) . fork (id,reverse)
= (\(a,b)->[a,b]) . (id &&& reverse)
= (\(a,b)->[a,b]) . (id *** reverse) . dup
= join $ curry ((\(a,b)->[a,b]) . second reverse)
對於您還需要導入Control.Monad
和Control.Monad.Instances
最後一個。另見this question。
後期編輯:此外,使用Control.Applicative
由ertes回答暗示,
= (:) <*> ((:[]) . reverse)
只有當你確定與約束。這不適用於所有用途。 – 2012-07-29 14:43:20
@ ThomasM.DuBuisson:什麼約束? – 2012-08-09 14:30:44
@BenMillwood我指的是typeclass約束。 JohnL的答案是'a - > [a]'類型。這個答案雖然很好乾淨,但是類型爲Monad(( - > a)=> a - > [a]' – 2012-08-09 15:57:47