Запрос на выражения типа в ML - PullRequest
1 голос
/ 15 июля 2010

All

Вот выражение типа, которое мне нужно преобразовать в выражение ML:

int -> (int*int -> 'a list) -> 'a list

Теперь я знаю, что это выражение стиля карри, которое принимает 2 аргумента: 1-й аргумент = Тип int и 2-й аргумент = функция, которая дважды принимает предыдущее значение типа int и возвращает список любого типа

Мне трудно вычислить такую ​​функцию, которая бы взяла int и вернула бы 'a list.

Я новичок в ML, и поэтому это может быть тривиально для других, но, очевидно, не для меня.

Любая помощь очень ценится.

1 Ответ

1 голос
/ 15 июля 2010

Вы получаете int и функцию int*int -> 'a list.Вы должны вернуть 'a list.Поэтому все, что вам нужно сделать, это вызвать функцию, которую вы получаете с помощью (x, x) (где x - это int, который вы получаете) и вернуть результат этого.Итак,

fun foo x f = f (x,x)

Обратите внимание, что это не единственная возможная функция с типом int -> (int*int -> 'a list) -> 'a list.Например, функции fun foo x f = f (x, 42) и fun foo x f = f (23, x) также будут иметь этот тип.

Редактировать:

Чтобы обеспечить точное соответствие типа, добавьте аннотацию типа, чтобы ограничить возвращаемый тип f:

fun foo x (f : int*int -> 'a list) = f (x,x)

Обратите внимание, однако, что для этого нет реальной причины.Эта версия ведет себя точно так же, как и прежде, за исключением того, что она принимает только функции, которые возвращают список.

...