Оператор СМЛ " о " только на один-аргумент функции?

- это o оператор композиции (например. val x = foo o bar, где foo и bar обе функции), можно использовать только для функций с одним аргументом и / или функций с равным количеством аргументов? Если нет, то каков синтаксис, скажем, composing foo(x,y) С bar(x).

3 ответов


как уже сказал Майкл, да, SML имеет только функции с одним аргументом. Но я хочу немного уточнить.

следующая функция:

fun foo (x,y) = x + y

тип:

fn : int * int -> int

это означает, что первый аргумент представляет собой кортеж из двух ints. Так что вы могли бы сделать что-то вроде:

(sign o foo) (4,~5)

который дал бы вам то же самое, что sign (foo (4,~5)).

хорошо, но как насчет чего-то подобного?

fun bar x y = x + y

он имеет тип:

fn : int -> int -> int

что означает, что bar фактически принимает только одно целое число и возвращает функцию. Поэтому вы не можете этого сделать:

(sign o bar) 4 ~5

потому что bar возвращает функцию, а sign принимает целое число. Вы можете сделать это, хотя:

(sign o bar 4) ~5

, потому что bar 4 - это функция, которая добавляет 4 к ряду.


SML имеет только один аргумент функции;foo(x,y) функция foo принимая один аргумент, кортеж (x, y). Таким образом, нет необходимости в специальной обработке и bar(x) необходимо будет вернуть кортеж соответствующего типа, чтобы составить его с помощью foo.


Я видел некоторый стандартный код ML (в частности, код Poly/ML Isabelle/Pure), который помещает дополнительные операторы композиции в среду верхнего уровня, которые обрабатывают такую ситуацию. Например:

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)

Как правило, такие вещи следует использовать экономно (четыре или более o становится немного глупо), но это довольно полезно, по крайней мере oo вокруг.