Что означает «=>» в стандартных мл? - PullRequest
2 голосов
/ 21 октября 2019

Кажется, что это означает, что функция выводит это ... но я не могу найти объяснение где-либо. Я знаю, -> для типов, я прошу объяснить =>.

val twice = fn f => fn x => f(f x);

^ Пример

1 Ответ

2 голосов
/ 21 октября 2019

Вместе с ключевым словом fn они образуют лямбда-выражения, то есть анонимные функции. В вашем примере twice получает такое лямбда-выражение. С более очевидными пунктами:

val twice = (fn f => (fn x => f(f x)))

twice, следовательно, является функцией, которая принимает функцию и возвращает другую функцию (другое лямбда-выражение). Когда вы вызываете лямбда-выражение, происходит то же самое, что и при вызове нормальной функции:

- fun plus2 x = x + 2;
> val plus2 = fn : int -> int
- twice plus2 4
> val it = 8 : int

twice plus2 означает, что мы дважды вызываем plus2 в качестве параметра f, поэтому оно эквивалентно fn x => plus2(plus2 x). Когда мы затем вызываем результат на 4, x заменяется на 4, что приводит к plus2(plus2 4), что приводит к 8.


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

fun foo x = x * 3
val foo = fn x => x * 3
...