OCaml: связанные выражения v. Функции - PullRequest
4 голосов
/ 20 сентября 2009

Здесь у нас есть определение функции:

let f x = x + 3;;

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

let g = 4;;

Может ли g просто рассматриваться как постоянная функция, которая не принимает аргументов?Есть ли разница?

Ответы [ 3 ]

5 голосов
/ 20 сентября 2009

разница между

let f() = expr

и

let f = expr

в не чистом языке означает, что «эффекты» expr выполняются на каждом «сайте вызова» в первом случае и только один раз на сайте определения в последнем случае. Это одно из очень немногих различий между ними, но, возможно, самое важное.

5 голосов
/ 20 сентября 2009

Да. С полностью функциональной точки зрения (как это практикуется в Haskell) все является функцией ( На самом деле все ).

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

Есть ли разница?

Ну, OCaml не является чисто функциональным. Это означает, что функциям разрешено выполнять побочные эффекты, которые немного отличаются от определения постоянного значения.

Этот код (F # здесь - но очень похож на Caml) будет вполне допустимым.

let name = 
    Console.Write("Enter your Name: ")
    Console.ReadLine()
1 голос
/ 20 сентября 2009

Технически, определение переменных - это совпадения с образцом:

let [x] = someList
let y::zs = someList
let (Some z) = someOption
let _ = someIgnoredExpr
...