Là toán tử thành phần o
(ví dụ: val x = foo o bar
, trong đó foo
và bar
là cả hai hàm), chỉ có thể sử dụng trên các hàm và/hoặc hàm đối số đơn lẻ với số đối số bằng nhau? Nếu không, cú pháp là gì, giả sử, soạn foo(x,y)
với bar(x)
.Toán tử SML `o` chỉ hữu dụng trên các hàm đối số đơn?
Trả lời
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
Vì bar 4
là hàm có thêm 4 số.
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
.
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.
Rất hữu ích. Cảm ơn rất nhiều! – GregT
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. –
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