Стандартный ML: пытается получить правильную подпись функции - PullRequest
1 голос
/ 29 марта 2020

Я пытаюсь создать функцию с такой подписью:

'a->'b->('a * 'b ->'b)->'b

Я пытался сделать функцию, подобную этой:

fun f x y z = z(x,y);

, но ее подпись другая, это:

'a->'b->('a * 'b ->'c)->'c

Как мне подогнать его под запрошенный? Любой совет может быть?

1 Ответ

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

Я думаю, что наименее «искусственным» было бы что-то вроде:

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

, который гарантирует, что тип возвращаемого значения g соответствует типу его второго параметра, вызывая g дважды, и результат одного вызова будет второй аргумент к другому.

Но более простое решение, если это не «обман», это просто добавить явную аннотацию типа:

fun f x (y : 'b) g : 'b = g (x, y)
...