Вместе с ключевым словом 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