Функция типа: ('a -> ('b -> 'c)) -> ('a -> 'b) -> ('a -> 'c) в стандарте ML

Во время подготовки к экзамену по языкам программирования есть несколько вопросов о выводе типов для секции Standard ML, большинство из них я могу решить, сделав вывод типов в своей голове, и я в этом неплохо разбираюсь, однако есть один вопрос, который оставляет меня в тупике.

Я должен написать функцию типа:

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

Поэтому у меня в голове должна быть функция с двумя аргументами, которые являются функциями f и g. Оба будут принимать аргумент x, но я не могу добавить этот аргумент x в эту функцию, так как он принимает только два аргумента, поэтому мне осталось создать эту функцию, используя оператор o, для функций конвейерной разметки.

Таким образом, f принимает аргумент и возвращает функцию, g принимает аргумент и возвращает значение. Затем общая функция принимает значение и возвращает значение.

Я не уверен, как я могу применить f и g, используя только оператор o, чтобы подразумевать эти правила.

Любая помощь будет принята с благодарностью:) Спасибо, Ciaran

1 ответ

Решение

Как вы уже упоминали, вам нужно написать функцию с двумя аргументами:

fun my_function f g = body

где f : 'a -> 'b -> 'c а также g : 'a -> 'b а также body : 'a -> 'c,

поскольку body имеет тип 'a -> 'cмы можем написать это как

body = fn x => body'

где body' имеет тип 'c а также x : 'a,

Обратите внимание, что f x : 'b -> 'c а также g x : 'bи если у вас есть функция типа 'b -> 'c и значение типа 'b легко создать значение типа 'c применяя функцию к аргументу: (f x) (g x),

Вышесказанное дает нам:

fun my_function f g = fn x => (f x) (g x)

или, альтернативно, перемещение x в левой части определения мы получаем:

fun my_function f g x = f x (g x)

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

Другие вопросы по тегам