2013-02-04 23 views

Trả lời

16

Như Michael đã nói, có, SML chỉ có các hàm đối số duy nhất. Tuy nhiên, tôi muốn xây dựng một chút.

Chức năng sau đây:

fun foo (x,y) = x + y 

Có loại:

fn : int * int -> int 

Có nghĩa là đối số đầu tiên là một tuple của hai ints. Vì vậy, bạn có thể làm điều gì đó như:

(sign o foo) (4,~5) 

Điều này sẽ cung cấp cho bạn giống như sign (foo (4,~5)).

Được rồi, nhưng còn những thứ như thế này thì sao?

fun bar x y = x + y 

Nó có các loại:

fn : int -> int -> int 

Có nghĩa là thanh thực sự chỉ mất một số nguyên, và trả về một chức năng. Vì vậy, bạn không thể thực hiện việc này:

(sign o bar) 4 ~5 

Vì thanh trả về hàm và ký hiệu mất một số nguyên. Tuy nhiên, bạn có thể thực hiện việc này:

(sign o bar 4) ~5 

bar 4 là hàm có thêm 4 số.

+0

Rất hữu ích. Cảm ơn rất nhiều! – GregT

+2

Nếu bạn định nghĩa một hàm 'uncurry' để hỗ trợ "vấn đề" cuối cùng của bạn với 'sign o bar', và có thể cũng là một hàm' flip' có thể lật "sắp xếp đối số" bằng cách lật cặp '(x, y)' tới '(y, x)', v.v. –

+0

Jesper: Trong trường hợp này, tôi có thể định nghĩa toán tử $ và thực hiện 'dấu $ bar xy'. – Tayacan

6

SML chỉ có các hàm đối số đơn lẻ; foo(x,y) là một hàm foo lấy một đối số duy nhất, bộ tảo (x, y). Do đó, không cần xử lý đặc biệt và bar(x) sẽ cần phải trả về một bộ loại thích hợp để soạn nó với foo.

3

Tôi đã nhìn thấy một số mã ML tiêu chuẩn (đặc biệt là mã Poly/ML Isabelle/Pure), đặt các toán tử thành phần bổ sung vào môi trường cấp cao nhất xử lý loại tình huống này. Ví dụ .:

fun (f oo g) x y = f (g x y) 
fun (f ooo g) x y z = f (g x y z) 
fun (f oooo g) x y z w = f (g x y z w) 

Nói chung, những việc như vậy nên được sử dụng một cách tiết kiệm (bốn hoặc nhiều o được nhận một chút ngớ ngẩn), nhưng nó là khá hữu ích có ít nhất oo xung quanh.