2013-09-28 11 views
9

Skład F i G, który wygląda jakWspólny wzór udziałem składu funkcji ( A B -> f (G) (g b))

f :. g = \a b -> f (g a) (g b) 

jest wzór znajdę bardzo często w moim kodu. Jest podobny do jednofunkcyjnego składu funkcji, tylko f jest binarny i chcę g zastosować do obu argumentów, zanim zostaną one przekazane do f.

Kiedy pytam lambdabot przekonwertować to do punktowego postaci wolnej, otrzymuję dziwne zaklęcie

których wolałbym nie mieć w moim kodu, więc skończę tylko wypisywanie wzór wyraźnie .

Czy istnieje powszechnie akceptowany sposób pisania kombinator dla tej sytuacji? A może dziwię się, że znalazłem się w tej sytuacji całkiem sporo?

Nie mam konkretnego przykładu, kiedy używam tego w tej chwili, ponieważ nigdy nie myślałem o tym tutaj, kiedy go potrzebowałem, ale można sobie wyobrazić, że bardzo dokładnie pisałem formułę odległości euklidesowej, tak:

distance = sqrt . (+) :. (^2) 
+2

'flip' może być wyeliminowana:' (g.). f. g' –

Odpowiedz

24

funkcja ta nazywa on w module Data.Function.

Jest to często używany infiks, taki jak sqrt . (+) `on` (^2).

+2

Nie mogę uwierzyć, że o tym nie pomyślałem! Wielkie dzięki. – kqr

+0

Typowym przykładem użycia jest "sortBy (porównaj \" na \ "abs"). –

+0

Będę jednak pamiętać dla przyszłych użytkowników Google, że "porównywanie abs" jest bardziej idiomatyczne niż "porównanie" na "abs". Działa to, ponieważ 'porównywanie = przy porównaniu' jest zdefiniowane gdzieś w standardowych bibliotekach. – kqr

2

Nie próbuj pisać w stylu wolnym od punktów. Jest to przykład faktu, że punktowy często nie jest tak czytelny.

Wystarczy zdefiniować go thusly:

(:.) :: (b -> b -> c) -> (a -> b) -> (a -> a -> c) 
infixr 9 (:.) 
f :. g x y = f (g x) (g y) 
+0

W tym miejscu operator infiksów jest wątpliwy, szczególnie, że wielu używa ': .' lub'.: 'Dla' (.). (.) ' – jozefg

+0

@jozefg Nie strzelaj do posłańca - jest to symbol OP użyty w pytaniu. –

+0

@jozefg Rozważnie wybrałem ': .' jako równoległe do'.: ', Które jest rzeczywiście często używane dla operatora sowy. Postrzegam go jako '.:' Przyjmuje funkcję jednego argumentu po lewej (stąd kropka) i funkcję dwóch argumentów po prawej (stąd podwójne kropki) - więc ': .' powinno przyjąć funkcję dwóch argumentów po lewej i funkcja jednego argumentu po prawej. – kqr

Powiązane problemy