F # синтаксический сахар - PullRequest
4 голосов
/ 06 марта 2009

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

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

Ответы [ 7 ]

6 голосов
/ 06 марта 2009

Большая часть синтаксиса 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

4 голосов
/ 14 марта 2009

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

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

let inc x = x + 1

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

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

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

3 голосов
/ 06 марта 2009

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

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

  • Там нет волшебного "пустого" типа, который не действительно тип
    • Следовательно, все является выражением
  • Все функции одинарные
  • Функции первого класса

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

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

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

2 голосов
/ 31 марта 2009

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

fsharpcheatsheet.pdf

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

2 голосов
/ 06 марта 2009

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

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

let inc x = x + 1;

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

fun x -> x + 1
1 голос
/ 22 апреля 2015

http://www.samskivert.com/code/fsharp/fsharp-cheat-sheet.pdf

Это довольно обширная шпаргалка, которая очень помогла мне с изучением F #

0 голосов
/ 16 марта 2009

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

let i = (fun x -> x + 1)0  //i equal 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...