Использование ключевого слова fun в ocaml - PullRequest
0 голосов
/ 20 сентября 2018

Поскольку в Ocaml используются выводы типа, а функции являются типом, нужно ли использовать fun для объявления функции?Например, REPL / интерпретатор для Ocaml выполняет это утверждение без жалоб:

let average a b =
  (a +. b) /. 2.0;;

Означает ли это, что я могу обойтись без fun при объявлении функций?Когда это нужно или нужно?

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

let average a b = ... в точности эквивалентно let average = fun a b -> ... - вы всегда можете использовать первое поверх второго.Это просто вопрос стиля, который вы предпочитаете.Мне кажется, что большинство программистов используют первую форму, но некоторые вводные материалы используют последнюю форму, чтобы прояснить, что функции являются значениями, как и любые другие, и могут быть созданы с использованием ключевого слова fun.

Однако let f = fun ... не единственный способ использовать fun.Вы можете использовать его там, где ожидается значение типа функции, например, в качестве аргумента map.Поэтому, если у вас есть что-то вроде List.map (fun x -> x+1) xs, вы не можете просто поставить let вместо fun, потому что определение там не имеет синтаксического смысла.Конечно, вы можете использовать let add1 x = x+1 in List.map add1 xs, и это прекрасно работает, но это более многословно и вводит новое имя, которое используется только один раз и ничего не добавляет.

Так что fun полезно, когда вы хотитепередать функцию без указания имени.

0 голосов
/ 20 сентября 2018

Ключевое слово fun необходимо для анонимных функций.Например, следующий код удваивает каждый элемент списка l = [ 1; 2; 3; 4]

let l = [1; 2; 3; 4]
let doubled_l = List.map (fun x -> 2 * x) l

, но этот фрагмент может быть переписан как

let l = [1; 2; 3; 4]
let double x = 2 * x
let doubled_l = List.map double l

(или даже List.map ( ( * ) 2 ) l)

Напротив, ваша средняя функция может быть переписана как

let average = fun x y -> (x +. y) /. 2.  

или

let average = fun x -> fun y -> (x +. y) /. 2.  

(синтаксис average x y = ... на самом деле является синтаксическим сахаром для этой формы)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...