Как получить доступ к аргументу из функции, переданной в качестве аргумента в SML
Я новичок в кодировании SML и все еще пытаюсь понять сопоставление с образцом. Я пытаюсь выяснить, как получить доступ к аргументу из функции, переданной в качестве аргумента в SML. Например, если функция принимает 2 аргумента, функцию и целое число, как я могу получить доступ к аргументу (для простоты, если предположить, что он имеет только один), который имеет функция аргумента. Имеет ли этот вопрос смысл в SML? Вот код, который не работает, но я думаю, что он иллюстрирует то, что я пытаюсь сделать.
fun argumentExtraction (n,f) =
case f of
fn x => x
1 ответ
Функция не имеет аргументов, она принимает аргументы. Вы передаете аргументы функции и получаете результат обратно. Вы не можете спросить функцию, каковы ее аргументы, потому что у них их еще нет. Вы должны дать аргументы функции.
Чтобы сделать это, возможно, немного яснее, давайте рассмотрим пример. Давайте возьмем следующие функции:
fun add x y = x + y
fun plus1 x = x + 1
fun applyTwice f x = f (f x)
Сейчас applyTwice
принимает функцию и аргумент и применяет функцию к аргументу дважды. Мы можем назвать это так:
applyTwice plus1 40
или вот так:
applyTwice (add 1) 40
и в обоих случаях ответ будет 42 (потому что это значение plus1 (plus1 40)
и из add 1 (add 1 40)
, add 1
на самом деле точно такая же функция, как plus1
).
Теперь я не уверен, хотите ли вы быть в состоянии пройти (plus1 40)
в качестве значения для f
а потом как-то получить 40
от того или хотите ли вы пройти (add 1)
а потом как-то вернуть 1
, но оба невозможны.
В случае (plus1 40)
вы даже не можете передать это в качестве значения для f
, f
должна быть функцией, но (plus1 40)
целое число (41), а не функция.
(add 1)
с другой стороны, это функция, и вы действительно можете передать ее в качестве значения для f
, На самом деле я сделал это в моем примере. Но то, что вы не можете сделать, это получить значение 1
назад от этого. Я имею в виду, представьте, что есть способ, которым вы могли бы сделать это. Что должно произойти, если вы прошли plus1
вместо (add 1)
, Что вы должны получить от этого? Там нет значения, захваченного в plus1
так что возвращаться нечего, но ясно plus1
так же, как действительный аргумент applyTwice
как (add 1)
,
Это может иметь смысл только в том случае, если частично примененная функция имеет тип, отличный от обычных функций, что позволяет вам определить функцию, которая принимает (add 1)
в качестве одного аргумента, но не plus1
, Однако это не тот случай, ML, и в этом нет особой выгоды. Наличие различных типов функций просто усложнит систему типов и усложнит определение функций более высокого порядка (поскольку они должны иметь возможность работать с обоими типами функций). Также я не вижу варианта использования, где эта способность была бы даже полезна.