2012-07-09 18 views
6

Zawsze uważałem, że F # ma dwa różne sposoby przekazywania argumentów, stylu curry i stylu krotki. Czy to prawda?F # parameter passing

Czy to nie jest po prostu jeden styl, styl curry, a argumenty mogą być prostymi wartościami lub krotkami.

np.

someFunc (a,b) = 

nie jest to funkcja z jeden curry stylu argument, który okazuje się być krotka? W ten sposób pozwalając mi przekazać krotki do tej funkcji za pomocą operatora pipleline? (gdzie elementy krotki nazywa)

(1,2) |> someFunc 

Czy jest to prawidłowe?

Odpowiedz

6

Będzie to działać dobrze - różnica jest, gdy masz

let f (a,b) = ... 
let f2 a b = ... 

następnie można utworzyć częściowo stosowana F2 łatwo, ale f nie działa już tak dobrze - trzeba zrobić

let partial = fun t -> f (1,t) 
let partial2 = f2 1 
+0

Tak, i czy nie jest tak po prostu dlatego, że "f" ma _jeden argument, który jest krotką z nazwanymi elementami? Chodzi mi o to, że możesz robić takie fajne rzeczy jak "somefunc abc (d, e, f) g", a to oczywiście nie jest ani czysty curry, ani styl literowy, co mnie przekonało, że F # ma tylko styl curry, gdzie argumenty są po prostu wartościami lub krotkami. Czy to właściwy sposób myślenia o tym? –

+0

To się zgadza. –

4

Tak, wszystkie funkcje F # są "curry styl". Kiedy masz definicję takiego:

let someFunc (a,b) = a + b 

mieć funkcję, która pobiera jeden argument, krotka, który jest rozkładany przez wzór pasujący (tak, pasujący wzorzec jest dostępny w zaskakująco słodkie takich miejscach). Jest to równoznaczne z następującą definicją, która przemieszcza wzorzec dopasowania do ciała funkcji:

let someFunc t = 
    match t with 
    | a, b -> a + b 

który również jest równoważna

let someFunc = function 
    | a, b -> a + b 

pierwsza wersja, z wzorem pasującym do samego argumentu , jest oczywiście preferowane w tym przypadku prostych nazwanych wiązań.

Należy jednak pamiętać, że F# methods to jednak "styl krotki" (jest to jedno z tych miejsc, w których F # przykleja się do standardowych obiektów zorientowanych obiektowo .NET).