2014-11-21 10 views
6

infix kullanımı için bir işlev Verilen:`flip` argümanlar

argümanlar bir yardımcı işlevi tanımlayarak saygısız olabilir
let f a b = (a+10, b) 
f 4 5 
=> (14,5) 
4 `f` 5 
=> (14,5) 

:

let g = flip f 
4 `g` 5 
=> (15,4) 

bu satır içi yapmak mümkün mü ?

4 `flip f` 5 
=> parse error on input `f' 
4 `(flip f)` 5 
=> parse error on input `(' 

Benim kullanım durumu Control.Arrow.first olduğunu. Bunun yerine

(+10) `first` (7,8) 
(17,8) 

I, HaskellWiki article on infix operators detaylandırıldığı gibi

let forwardFirst = flip first 
+1

senin 'g' yi tanımladığınıza göre bunu yapmak istemek için durum kullanın. –

+2

Sadece kullanım durumumu ekledim. :) –

+1

Bu sorunuza doğrudan bir cevap değil, ama '(7,8) ve _1% ~ (10)' kullanarak lens olarak yazabilir. Tabii ki, sadece '' & kullanıp '(7,8) ve ilk (10)' olarak yazabilir. Bu istediğin şeye benziyor mu? – snak

cevap

1

yazmaya gerek kalmadan

(7,8) `forwardFirst` (+10) 

gibi ileriye uygulama tarzı çözümü tercih ediyorum

Sadece normalde yapabileceğinizi unutmayın. İki argüman alan bir fonksiyon beraberdir. Aslında ikiden fazla bağımsız değişken alan bir fonksiyon için, bunu yapabilirsiniz ama böyle bir şey olurdu sizin durumunuzda bunu yapmanın yolu

yaklaşık olarak güzel değil:

nedir
let f a b = (a+10, b) 
let h a b = (f `flip` a) b 
let a = 3 
let b = 2 
f a b = (13,2) 
a `h` b = (12,3) 
+0

b = ('çevirme' f) her iki fonksiyonun aynı b'. Daha karmaşık sürüm 'h' avantajı nerede? –

+0

Fuar noktası. İstediğin şeyi yapmanın daha iyi bir yolu olup olmadığından emin değilim. –