SML функционирует как значения - PullRequest
0 голосов
/ 25 марта 2020

Я экспериментирую с этим в SML

- val p = (fn (x,y) => x + y, fn (x,y) => x - y)
val p = (fn,fn) : (int * int -> int) * (int * int -> int)

Но я могу оценить его только по одному

- #1(p)(3,2)
5

или

- #2(p)(3,2)
1

Почему я не могу сделать и то и другое?

- (p)(3,2)
Error: operator is not a function [tycon mismatch]...

Какая форма квази-лямбда-исчисления мне понадобится, чтобы она возвращала 2-кортеж, первую позицию из x+y лямбда-функции и вторую из x-y лямбда-функция? На первый взгляд, похоже, что так и будет. В общем, я заблудился относительно того, что такое переменная и функция в этом примере.

Ответы [ 2 ]

2 голосов
/ 25 марта 2020

fn (x,y) => x + y и fn (x,y) => x - y являются функциями; p - это пара функций; #1 p и #2 p являются функциями; пара не является функцией.

Если вам нужна анонимная функция (я предполагаю, что это означает «форма квази-лямбда-исчисления»), она выглядела бы так: то есть сначала возьмите пару функций, затем что-то, затем примените обе функции к чему-либо.

- (fn (f,g) => fn x => (f x, g x)) p (3,2);
val it = (5,1) : int * int

или, если вы решили использовать селекторы вместо сопоставления с образцом:

- (fn fns => fn x => (#1 fns x, #2 fns x)) p (3,2);
val it = (5,1) : int * int
2 голосов
/ 25 марта 2020

Я не уверен, что вы спрашиваете. Функция - это функция, пара - это пара. Пара функций не является функцией, поэтому ее нельзя применять.

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

fun mapPair (f, g) (x, y) = (f x, g y)

С этим вы можете сделать:

mapPair (p) (2, 3)

Редактировать: Выше приведено просто сокращение для функции карри, то есть функция, возвращающая функцию:

fun mapPair (f, g) = fn (x, y) => (f x, g y)

или эквивалентно:

val mapPair = fn (f, g) => fn (x, y) => (f x, g y)
...