2009-03-05 3 views
4

F # явно содержит много вещей, которые являются синтаксическим сахаром, и, как я пытаюсь изучить его - без помощи книги - я ошеломлен явным разнообразием синтаксиса. Есть ли более простой «основной» язык, скрытый за всем синтаксическим сахаром? Есть ли список чит-листов синтаксических сахаров и как они сопоставляются с основным языком?F # синтаксический сахар

И эй, есть ли причина, по которой F # требует другого оператора присваивания для определения функций, чем для лямбда, или это было случайным решением? например "пусть inc x = x + 1" vs "fun x -> x + 1"

+0

если у вас есть #Light, включите его. – nlucaroni

+0

Поскольку все примеры, которые я вижу, имеют # свет, я бы не имел понятия, как писать код F # без него. – Qwertie

+0

Спецификация F # охватывает то, что делает синтаксис #light (раздел 15, IIRC). В общем, вы будете добавлять много «в» повсюду. Я не думаю, что полезно отключить его (для обучения), так как синтаксис #light довольно прост. – MichaelGG

ответ

2

Только одно из двух упомянутых выражений использует оператор присваивания.

Это определяет функцию, связанную с идентификатором «inc», которая принимает единственный аргумент типа int и возвращает аргумент +1.

let inc x = x + 1; 

С другой стороны, это выражение, которое представляет собой лямбда. Он не связан ни с одним идентификатором, который не может существовать только сам по себе. Он должен быть частью большего выражения.

fun x -> x + 1 
+1

Я знаю, какие функции есть, и я знаю, что такое лямбда. – Qwertie

+0

@ Qwertie, тогда вы должны сформулировать свой вопрос более ясным образом. – JaredPar

+0

Я думаю, что это довольно ясно. Я не спрашивал, что это за функция или что такое лямбда. Скорее это был вопрос о синтаксисе. – Qwertie

6

Большое F # синтаксис происходит от OCaml - многие программы OCaml будет скомпилировать и запустить в F # без каких-либо изменений.

Хорошие стартовые ссылки:

http://msdn.microsoft.com/en-us/fsharp/default.aspx

http://en.wikibooks.org/wiki/F_Sharp_Programming

http://lorgonblog.spaces.live.com/blog/cns!701679AD17B6D310!887.entry?_c=BlogPart

3

F #, запрещая .NET Interop, кажется довольно проще, чем, скажем, C#. (Не совсем собирание на нем, в частности, но так как это еще один популярный .NET язык ...)

Возьмите F # функции, например:

  • Там нет никакой магии «пустота» типа-то будет-not- на самом деле-а-типа
    • Следовательно, все выражение
  • Все функции унарные
  • функции первого класса типа

Прямо там у вас есть система функций, которая намного проще, чем, скажем, C#, где void создает специальный случай, и нет возможности обобщения для всех функций.

Что касается вашего конкретного вопроса, «let f x = x» по сравнению с «let f = fun x -> x», это, вероятно, унаследованная черта от ML. (Я не вижу какой-либо особой причины, почему это не могло быть «let f = fun x = x», разве что, возможно, это было бы более запутанным и, возможно, сделать грамматику более сложной? (Лично я бы предпочел " пусть f = \ xx ".)) В любом случае, хотя в большинстве случаев они эквивалентны, иногда вы должны определить синтаксическую функцию вместо значения функции.

.NET interop может, к сожалению, сделать вещи немного более сложными, хотя, вероятно, не больше или намного больше, чем другие языки .NET.

+1

«no magic» void «type-thats-not-really-a-type», кроме единицы, конечно. – Richard

+1

Да, именно так я и думал. Или Haskell's(). Хотя я думаю, что было плохо информировано о том, что C#/C/C++/Java не имеет ключевых слов «define function» и «define variable», я не думаю, что синтаксис C# почти так же плох, как C++, язык был в значительной степени основанный на. – Qwertie

+3

Единица имеет значение,(). Нет волшебства: > id() ;; val it: unit =() Как вы передаете значение void? Как вы можете, скажем, в C# объявить делегата, который включает любую функцию? Вы не можете. Вы застряли с отдельными кодировками для void (Action) против nonvoid (Func). – MichaelGG

4

Наряду с ссылками Брайана, я хотел бы перейти по ссылкам к моей собственной серии блога, Why I Love F#, которая охватывает некоторые основы.

Что касается вашего второго вопроса, «пусть inc x = x + 1» и «fun x -> x + 1» - два способа выражения функции, но только первый использует оператор присваивания. На самом деле,

let inc x = x + 1 

эквивалентно:

let inc = (fun x -> x + 1) 

Первый является сокращением для второго, но второй может осветить, как все функции F # действительно Лямбдами связаны с именами.

0

Обратите внимание, что вы можете применить непосредственно лямбда в выражении.

let i = (fun x -> x + 1)0 //i equal 1 
2

Если вы ищете чит-лист для F #, это тот, который я использую на регулярной основе.

fsharpcheatsheet.pdf

Он не охватывает все, такие вещи, как единицы измерения или котировок, и не говорить о различных библиотеках, но она охватывает много синтаксиса.

+0

ссылка мертва, обновите? – Maslow

+0

Обновлена ​​ссылка на копию, хранящуюся на scribd. Чит-лист не обновлялся, поэтому он устарел. Но он имеет некоторый базовый синтаксис. –

Смежные вопросы