2016-05-29 3 views
5

Я изучаю F #, и я не могу понять, что такое разница между let, fun и function, и мой учебник действительно не объясняет это. В качестве примера:Разница между let, fun и function в F #

let s sym = function 
| V x -> Map.containsKey x sym 
| A(f, es) -> Map.containsKey f sym && List.forall (s sym) es;; 

Не могу я написал это без function ключевого слова? Или я мог написать это с fun вместо function? И почему я должен написать let, когда я видел несколько примеров, когда вы пишете

fun s x = 
... 

Какая разница на самом деле?

+0

Было бы немного проще, чтобы показать вам альтернативы, если вы сообщите нам, что '' V' и A' есть. –

+0

«Функция» - это своего рода «совпадение», которое приходит в себя в выражениях конвейера. например x |> функция | case1 -> ... | case2 -> ... Это приятный стиль. – sgtz

ответ

12

Я думаю, вы действительно должны спросить MSDN, но в двух словах:

let связывает значение с символом. Значение может быть простым типом, например int или string, но также может быть функцией. В функциях FP есть значения и могут обрабатываться так же, как и те типы.

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

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

let myFunction = 
    fun firstArg secondArg -> 
     someOperation firstArg secondArg 

И это очень четкий способ сказать это. Вы заявляете, что у вас есть функция, а затем привяжите ее к символу myFunction.

Но вы можете сэкономить немного набрав, просто приравнивая анонимное объявление функции и привязки его к символу с let:

let myFunction firstArg secondArg = 
    someOperation firstArg secondArg 

Что function делает это немного сложнее - вы объедините анонимный объявление функции одного аргумента с выражением match, путем сопоставления по неявному аргументу. Таким образом, эти два эквивалента:

let myFunction firstArg secondArg = 
    match secondArg with 
    | "foo" -> firstArg 
    | x -> x 

let myFunction firstArg = function 
    | "foo" -> firstArg 
    | x -> x  

Если вы только начинаете с F #, я бы избежал этого. Он имеет свои возможности (в основном для обеспечения более кратковременных функций более высокого порядка для карт/фильтров и т. Д.), Но приводит к тому, что код становится менее читаемым с первого взгляда.

9

Эти вещи являются яркими ярлыками друг к другу.

Самая фундаментальная вещь let. Это ключевое слово дает имена материал:

let name = "stuff" 

Говоря более технически, let ключевого слова определяет идентификатор и связывает его со значением:

let identifier = "value" 

После этого, вы можете использовать слова name и identifier в вашем и компилятор будет знать, что они означают.Без let не было бы способа назвать материал, и вы должны были бы всегда писать все свои данные в строке, вместо того, чтобы ссылаться на куски его по имени.

Теперь значения имеют разные ароматы. Есть строки "some string", есть целые числа 42, числа с плавающей запятой 5.3, логические значения true и т. Д. По специальному виду - функция. Функции также являются значениями, во многом похожими на строки и числа. Но как вы пишете функцию? Чтобы написать строку, вы используете двойные кавычки, но как насчет функции?

Ну, чтобы написать функцию, можно использовать специальное слово fun:

let squareFn = fun x -> x*x 

Здесь я использовал let ключевое слово, чтобы определить идентификатор squareFn и привязать этот идентификатор к значению функции вида. Теперь я могу использовать слово squareFn в своей программе, и компилятор узнает, что всякий раз, когда я его использую, я имею в виду функцию fun x -> x*x.

Этот синтаксис является технически достаточным, но не всегда удобным для записи. Поэтому для того, чтобы сделать его короче, let связывание имеет дополнительную ответственность на себя и обеспечивает более короткий путь, чтобы написать выше:

let squareFn x = x*x 

Это должно сделать это для let против fun.

Ключевое слово function - это короткая форма для fun + match. Письмо function эквивалентно написанию fun x -> match x with, период.

Например, следующие три определения эквивалентны:

let f = fun x -> 
    match x with 
    | 0 -> "Zero" 
    | _ -> "Not zero" 

let f x = // Using the extra convenient form of "let", as discussed above 
    match x with 
    | 0 -> "Zero" 
    | _ -> "Not zero" 

let f = function // Using "function" instead of "fun" + "match" 
    | 0 -> "Zero" 
    | _ -> "Not zero"