Может кто-нибудь объяснить мне и помочь мне понять, почему следующее выражение равно 11 в стандартном ML? Любая помощь очень ценится.

(fn f => (fn g => f(g 2))) (fn n => n+3) (fn n => n*4)
1
Teej 3 Апр 2017 в 21:06

2 ответа

Лучший ответ

Вы можете оценить выражение:

(fn f => (fn g => f(g 2))) (fn n => n+3) (fn n => n*4)

Здесь замените f на (fn n => n+3), чтобы он стал

(fn g => (fn n => n+3)(g 2)) (fn n => n*4)

Аналогичным образом замените g на (fn n => n*4), чтобы он стал

(fn n => n+3)((fn n => n*4) 2)

Аналогичным образом замените либо первое n на ((fn n => n*4) 2), либо второе n на 2.

3
Simon Shine 4 Апр 2017 в 13:27

Поскольку это похоже на домашнюю работу, я не хочу делать больше, чем подсказывать.

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

Например:

fun h f = (fn g => f(g 2))

fun f n = n + 3

fun g n = n*4

Тогда - посмотрите, можете ли вы понять, почему h f g оценивается как 11

Как еще один совет, в приложении функции ML ассоциативно слева, следовательно, h f g такой же, как

(h f) g 

Это означает, что функция h f (h возвращает функции) применяется к функции g. Обратите внимание, что функции, которые h возвращает, являются функциями, которые принимают функции (например, g) в качестве входных и возвращают целые числа (например, 11) в качестве выходных.

В заключение, как бы вы перешли от номера 2 к номеру 11, используя две простые функции f и g?

2
John Coleman 3 Апр 2017 в 20:06