2014-11-21 10 views
6

Biorąc pod uwagę funkcję użytkowania Infix:`flip` argumenty inline aplikacji infix

let f a b = (a+10, b) 
f 4 5 
=> (14,5) 
4 `f` 5 
=> (14,5) 

Argumenty mogą być przerzucony przez zdefiniowanie funkcji pomocnika:

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

to możliwe, aby to zrobić inline ?

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

Moje przypadek użycia jest Control.Arrow.first. Zamiast

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

wolałbym rozwiązanie do przodu aplikacja stylu jak

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

bez konieczności pisania

let forwardFirst = flip first 
+1

Jaki jest Twój używać przypadku, aby tego dokonać, biorąc pod uwagę, że już zdefiniowałeś 'g'? –

+2

Właśnie dodałem mój przypadek użycia. :) –

+1

Nie jest to bezpośrednia odpowiedź na twoje pytanie, ale możesz ją zapisać jako '(7,8) & _1% ~ (+10)' przy użyciu obiektywu. Oczywiście możesz po prostu użyć '&' i napisać to jako '(7,8) i pierwsze (+10)'. Czy jest to coś podobnego do tego, czego chcesz? – snak

Odpowiedz

1

Jak wyszczególniono w HaskellWiki article on infix operators,

Zauważ, że normalnie możesz to zrobić jest funkcją, która pobiera dwa argumenty: . Faktycznie, dla funkcji biorąc więcej niż dwa argumenty, można zrobić, ale to nie jest aż tak miły

sposób to zrobić to w Twoim przypadku będzie coś takiego:

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

Z 'g = flip f' i' h a b = (f 'flip' a) b' obie funkcje są takie same. Gdzie jest przewaga bardziej skomplikowanej wersji 'h'? –

+0

Punkt targów. Nie jestem do końca pewien, czy istnieje lepszy sposób robienia tego, co chcesz. –

Powiązane problemy