Как получить доступ к аргументу из функции, переданной в качестве аргумента в 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, и в этом нет особой выгоды. Наличие различных типов функций просто усложнит систему типов и усложнит определение функций более высокого порядка (поскольку они должны иметь возможность работать с обоими типами функций). Также я не вижу варианта использования, где эта способность была бы даже полезна.

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