Оператор СМЛ " о " только на один-аргумент функции?
- это 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
вокруг.