Функция типа: ('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
комбинатор.