2012-07-09 42 views
6

Tôi luôn nghĩ rằng F # có hai cách khác nhau để truyền đối số, phong cách cà ri và kiểu tuple. Điều này có thực sự chính xác không?Thông số F # đi qua

Không đơn giản là một kiểu, kiểu cà ri và đối số có thể là giá trị hoặc bộ dữ liệu đơn giản.

ví dụ:

someFunc (a,b) = 

không phải là một chức năng này với lập luận kiểu một cà ri mà sẽ xảy ra là một tuple? Vì vậy, cho phép tôi chuyển các bộ dữ liệu tới hàm này bằng toán tử pipleline? (trong đó các thành phần của bộ túp được đặt tên)

(1,2) |> someFunc 

Điều này có đúng không?

Trả lời

6

này sẽ chỉ làm việc tốt - sự khác biệt là khi bạn có

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

sau đó bạn có thể tạo một f2 áp dụng một phần dễ dàng, nhưng đối với e nó không hoạt động khá độc đáo - bạn phải làm

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

Có, và không phải là điều này đơn giản chỉ vì "f" có đối số _one_ xảy ra là một bộ tuple với các phần tử được đặt tên? Tôi có nghĩa là bạn có thể làm những thứ tuyệt vời như "somefunc abc (d, e, f) g" và điều này rõ ràng không phải là cà ri thuần túy hay phong cách typle, mà tôi tin rằng F # chỉ có kiểu cà ri, trong đó đối số đơn giản là giá trị hoặc bộ dữ liệu. Đây có phải là cách suy nghĩ đúng đắn không? –

+0

Điều này là chính xác. –

4

Có, tất cả chức năng F # là "kiểu cà ri". Khi bạn có một định nghĩa như:

let someFunc (a,b) = a + b 

Bạn có một hàm mang theo một lập luận, một tuple, hiện đang được phân hủy bởi mô hình phù hợp với (vâng, khớp mẫu có sẵn ở những nơi ngọt ngào đáng ngạc nhiên như thế này). Nó tương đương với định nghĩa sau đó di chuyển mô hình phù hợp với cơ thể của hàm:

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

nào cũng tương đương với

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

Phiên bản đầu tiên, với mô hình phù hợp trong lập luận riêng của mình , rõ ràng là thích hợp hơn trong trường hợp này của các ràng buộc có tên đơn giản.

Lưu ý rằng F# methods, tuy nhiên, là "kiểu tuple" (đây là một trong những nơi mà F # dán vào các tính năng hướng đối tượng .NET tiêu chuẩn).

Các vấn đề liên quan