繰り返しポップアップし、さまざまなより高度な概念とライブラリで再実装される、いくつかの基本的な慣用的なコンビネータがありますが、これらは本質的に非常に単純です。名前は異なる場合があり、他の観点から実装可能なものもあります。
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)
最後の1つについては、インポートする必要がありControl.Monad
ますControl.Monad.Instances
。この質問も参照してください。
後期編集:また、ertesControl.Applicative
による回答で示唆されているように使用して、
= (:) <*> ((:[]) . reverse)