Dưới đây là mã mà hoạt động tốt:Có thể nào trong F # để xử lý một đối số hàm trung bình?
let f x y z = x + y + z
let g x y = f x y
let h x z = z |> f x
Vì vậy, tôi có thể viết khái niệm "h 1", và hiển thị FSI:
val it : (int -> int -> int) = <fun:[email protected]>
Nếu tôi gọi là "h 1 2 3", các đối số được áp dụng yêu cầu hợp lý.
Nhưng nếu đối số cuối cùng có một kiểu khác nhau, mọi thứ trở nên khác nhau:
let ff x y (z : string) = x + y
let gg x y = ff x y
let hh x (z : string) = z |> ff x
Bây giờ chức năng hh cuối cùng gây ra một thông báo lỗi:
Script.fsx (119,10): FS0001 lỗi : Loại không phù hợp. Mong đợi một số
string -> 'a
nhưng được cung cấpint -> string -> int
. Loạistring
không phù hợp với loạiint
Tôi hiểu tại sao điều này xảy ra - "z" được gắn vào "ff x" làm cho nó một số thứ hai. Nhưng sau đó tôi mong đợi trong biểu thức ví dụ đầu tiên "h 1 2 3" không hoạt động đúng (được thực hiện như "f 1 3 2"). Nhưng nó hoạt động tốt.
Bạn có chắc chắn 'h 1 2 3' thực thi là' f 1 2 3' chứ không phải 'f 1 3 2'? Sau khi tất cả, 1 + 2 + 3 == 1 + 3 + 2 == 6. Có thể thử với một toán tử không chuyển tiếp? – tzaman
FWIW, các đối số được gắn nhãn của OCaml cho phép bạn áp dụng một phần không đúng thứ tự. –