2010-03-13 33 views
15

tôi có chức năng dưới đây và nó hoạt động:cà ri chức năng ẩn danh trong SML

(fn x => x * 2) 2; 

nhưng điều này không làm việc:

(fn x y => x + y) 2 3; 

bất cứ ai có thể cho tôi biết tại sao? Hoặc cho tôi một số gợi ý để làm cho nó hoạt động?

+0

hoạt động khi tôi đổi thành (fn (x, y) => x + y) (2,3); nhưng tại sao (fn x y => x * y) 2 3; tạo ra một lỗi – jjennifer

Trả lời

30

(fn x => fn y => x+y) 2 3; hoạt động. fn chỉ đơn giản là không có cùng một cú pháp cú pháp để xác định các hàm được kết hợp mà fun có.

0

Trong Standard ML, một hàm có thể chỉ có một đối số, vì vậy sử dụng

(fn (x,y) => x + y) (2,3) 

và loại là

fn: int * int -> int 

trong thời gian này (x, y) và (2, 3) là cấu trúc danh sách,

+0

nhưng thay đổi nó thành một chức năng chưa được kiểm tra, khác nhau là – newacct

+0

Ồ, cà ri! Xin lỗi, tôi đã không bắt được vấn đề, câu trả lời của sepp2k là tốt. – Waverim

+0

Ngoài ra, (2,3) không phải là một cấu trúc danh sách là một bộ kiểu int * int, khác với kiểu int trong danh sách sẽ là loại [2,3]. – Mateo

0

Câu trả lời được đăng ở trên là chính xác. Hàm SML chỉ mất chỉ một đối số. Kết quả là, chức năng SML có thể chỉ có một trong hai loại đầu vào:

1) t = (t1 * t2 * ... * tN), đối với một số N

2) t = a, đối với một số a.

Vì vậy, về mặt kỹ thuật, SML chỉ có các loại sản phẩm hoặc các loại đơn nhất làm đối số cho hàm. Người ta thường có thể nghĩ về điều này như là một Unary-Type hoặc một phép chiếu của một số loại sản phẩm.

Để có tách lạng bộ bên chức năng ẩn danh, hãy thoải mái làm tổ họ bên nhau như: fn x1 => fn x2 => ... fn xN => ...

Tôi nghĩ nó cũng quan trọng để biết rằng: fun a = fn x1 => fn x2 => ... fn xN => ... là sự mở rộng đầy đủ của đường syntact : fun a x1 x2 .. xN

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