2016-10-12 3 views
0

Я новичок в кодировании SML и все еще пытаюсь понять соответствие шаблонов. Я пытаюсь выяснить, как получить доступ к аргументу из функции, переданной как аргумент в SML. Например, если функция принимает 2 аргумента, функцию и целое число, как я могу получить доступ к аргументу (для простоты, если он имеет только один), что функция аргумента имеет. Этот вопрос имеет смысл в SML? Вот какой код, который не работает, но я думаю, что это иллюстрирует то, что я пытаюсь сделать.Как аргумент acess от функции, переданной как аргумент в SML

fun argumentExtraction (n,f) = 
    case f of 
     fn x => x 
+0

Похоже, вы хотите сделать интроспекцию такого рода, которая возможна в Python (где вы можете * получить информацию о аргументах функции, когда вы передали эту функцию). Это невозможно в SML. Было бы сложно реализовать статическую типизацию. Что вы надеетесь сделать? –

+0

Я думаю, вы поняли, что я пытаюсь сделать правильно, но я думаю, что это не работает в SML. Моя цель - найти способ выполнить функцию fn в моем примере кода в аргументе, который, по-видимому, я не могу получить напрямую. –

+0

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

ответ

0

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


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

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

+0

Значит, в SML не имеет смысла передавать функцию с аргументом в качестве аргумента? Будет ли это означать, что ближайшая альтернатива доступу к аргументу аргумента функции будет иметь функцию, принимающую дополнительный аргумент, представляющий этот аргумент (отделяя его от выполняемой функции)? –

+0

@JohnJenkins Я не уверен, что вы подразумеваете под первой частью. Если вы говорите о частичном применении функции curried: это часто имеет смысл сделать это, но вы не можете вернуть частично примененный аргумент обратно - это всего лишь захваченная переменная, и только сама функция может получить доступ к захваченным переменным , Невозможно определить, использует ли функция, которую вы принимаете в качестве аргумента, какие-либо переменные, не говоря уже о доступе к ним. Для вашего второго вопроса: Да, если вам нужен аргумент, это способ сделать это. – sepp2k

+0

Итак, вы не можете получить к ним доступ напрямую, но есть ли способ применить к ним функцию, предполагая, что функция передается с этим аргументом? По-видимому, функция, которая принимает функцию в качестве аргумента, не сможет получить доступ к аргументу этой функции, но если она сможет получить доступ к функции, которую она передала, и эта функция может получить доступ к ее аргументу, это работает? –

Смежные вопросы