F# Language - подсказки для новичка [закрыто
-
09-06-2019 - |
Вопрос
Похоже, здесь, в Stackoveflow, есть группа F# энтузиасты.
Я хотел бы лучше знать этот язык, так что, кроме Теория функционального программирования, Можете ли вы указать мне на лучшие отправные точки, чтобы начать использовать язык F#? Я имею в виду учебные пособия, как то, но, прежде всего, работающие образцы, чтобы иметь возможность начать что-то делать и наслаждаться языком.
Большое спасибо
Андреа
Решение
Не для того, чтобы взбесить себя ужасно, но я написал пару постов обзора в своем блоге здесь и здесь. Полем Крис Смит (парень в команде F# в MS) имеет статью под названием «F# за 20 минут» - Часть 1 и часть 2.
ПРИМЕЧАНИЕ, вы должны быть осторожны, так как последний CTP F# (версия 1.9.6.0) имеет некоторые серьезно нарушающие изменения по сравнению с предыдущими версиями, поэтому некоторые примеры/учебные пособия могут не работать без модификации.
Вот быстрое избавление от некоторых классных вещей, может быть, я могу дать вам несколько подсказок здесь, которые ясно очень Кратко и, вероятно, не очень здорово, но, надеюсь, даст вам что-то, с чем можно сыграть!:-
Первое примечание - большинство примеров в Интернете будут предполагать, что «легкий синтаксис» включен. Для достижения этого используйте следующую строку кода:-
#light
Это мешает вам вставить определенные ключевые слова, которые присутствуют для совместимости OCAML, а также необходимость прекратить каждую строку с полуколонами. Обратите внимание, что использование этого синтаксиса означает, что отступление определяет объем. Это станет ясным в более поздних примерах, все из которых полагаются на включенного синтаксиса легкого.
Если вы используете интерактивный режим, вам нужно прекратить все операторы с двойными полуколонами, например:-
> #light;;
> let f x y = x + y;;
val f : int -> int -> int
> f 1 2;;
val it : int = 3
Обратите внимание, что интерактивный режим возвращает результат «Val» после каждой строки. Это дает важную информацию об определениях, которые мы делаем, например, 'val f: int -> int -> int', указывает, что функция, которая принимает два int, возвращает int.
Обратите внимание, что только в интерактивном случае нам нужно прекратить строки с полуколонами, когда фактически определяем код F#, мы свободны от этого :-)
Вы определяете функции, используя ключевое слово «пусть». Это, вероятно, самое важное ключевое слово во всем F#, и вы будете использовать его много. Например:-
let sumStuff x y = x + y
let sumStuffTuple (x, y) = x + y
Мы можем назвать эти функции так:-
sumStuff 1 2
3
sumStuffTuple (1, 2)
3
Обратите внимание, что здесь есть два разных способа определения функций - вы можете отделить параметры с помощью пробела или указать параметры в «кортежах» (т.е. значения в скобках, разделенных запятыми). Разница в том, что мы можем использовать «приложение частичной функции» для получения функций, которые занимают меньше, чем требуемые параметры, используя первый подход, а не со вторым. Например:-
let sumStuff1 = sumStuff 1
sumStuff 2
3
Примечание мы получаем функцию из выражения «Sumstuff 1». Когда мы можем передать функции так же легко, как и данные, которые называются языком, имеющим «функции первого класса», это является фундаментальной частью любого функционального языка, такого как F#.
Сопоставление рисунков довольно круто, это в основном как оператор Switch на стероидах (да, я вырезал эту фразу с другой F#-IST :-). Вы можете делать что-то вроде:-
let someThing x =
match x with
| 0 -> "zero"
| 1 -> "one"
| 2 -> "two"
| x when x < 0 -> "negative = " + x.ToString()
| _ when x%2 = 0 -> "greater than two but even"
| _ -> "greater than two but odd"
Примечание Мы используем символ «_», когда хотим сопоставить что -то, но выражение, которое мы возвращаем, не зависит от ввода.
Мы можем сократить соответствие рисунков с использованием операторов IF, ELIF и ELE по мере необходимости:-
let negEvenOdd x = if x < 0 then "neg" elif x % 2 = 0 then "even" else "odd"
F# списки (которые реализованы в виде связанных списков внизу) можно манипулировать таким образом:-
let l1 = [1;2;3]
l1.[0]
1
let l2 = [1 .. 10]
List.length l2
10
let squares = [for i in 1..10 -> i * i]
squares
[1; 4; 9; 16; 25; 36; 49; 64; 81; 100]
let square x = x * x;;
let squares2 = List.map square [1..10]
squares2
[1; 4; 9; 16; 25; 36; 49; 64; 81; 100]
let evenSquares = List.filter (fun x -> x % 2 = 0) squares
evenSqares
[4; 16; 36; 64; 100]
Обратите внимание на список. Функция MAP «Карты» квадратной функции в список от 1 до 10, IE применяет функцию к каждому элементу. List.filter 'Filters' Список, возвращая только значения в списке, которые передают предоставленную функцию предиката. Также обратите внимание на синтаксис 'Fun x -> f' - это F# lambda.
Обратите внимание, что в течение всего мы не определяли никаких типов - типы F# компилятора/интерпретатора «проводят», то есть выясняет, что вы хотите от использования. Например:-
let f x = "hi " + x
Здесь компилятор/интерпретатор будет определять x - это строка, поскольку вы выполняете операцию, которая требует, чтобы X была строкой. Он также определяет, что тип возврата также будет String.
Когда есть двусмысленность, компилятор делает предположения, например:-
let f x y = x + y
Здесь X и Y могут быть несколькими типами, но компилятор по умолчанию в Int. Если вы хотите определить типы, вы можете использовать аннотация типа:-
let f (x:string) y = x + y
Также обратите внимание, что нам пришлось приложить к x: string в скобках, нам часто приходится делать это, чтобы разделить части определения функции.
Два действительно полезные и широко используемые операторы в F# - это операторы трубы и функциональный состав |> и >> соответственно.
Мы определяем |> Так:-
let (|>) x f = f x
Обратите внимание, что вы можете определить операторов в F#, это довольно круто :-).
Это позволяет вам писать вещи более четким образом, например:-
[1..10] |> List.map (fun x -> x * x) |> List.filter (fun x -> x % 2 = 0)
Позволит вам получить первые 10 ровных квадратов. Это яснее:-
List.filter (fun x -> x % 2 = 0) (List.map (fun x -> x * x) [1..10])
Ну, по крайней мере, я так думаю :-)
Функциональный состав, определяемый оператором >>, определяется следующим образом:-
let (>>) f g x = g(f(x))
Т.е. вы перенаправляете операцию, только параметр первой функции остается неопределенной. Это полезно, как вы можете сделать следующее:-
let mapFilter = List.map (fun x -> x * x) >> List.filter (fun x -> x % 2 = 0)
Здесь MapFilter примет список ввода и вернет список, как раньше. Это сокращенная версия:-
let mapFilter = l |> List.map (fun x -> x * x) |> List.filter (fun x -> x % 2 = 0)
Если мы хотим писать рекурсивные функции, мы должны определить функцию как рекурсивную, поместив «rec» после let. Примеры ниже.
Некоторые крутые вещи:-
Факториал
let rec fact x = if x <= 1 then 1 else x * fact (x-1)
NTH Fibonacci номер
let rec fib n = if n <= 1 then n else fib (n-1) + fib (n-2)
Fizzbuzz
let (/%) x y = x % y = 0
let fb = function
| x when x /% 15 -> "FizzBuzz"
| x when x /% 3 -> "Fizz"
| x when x /% 5 -> "Buzz"
| x -> x.ToString()
[1..100] |> List.map (fb >> printfn "%s")
В любом случае это очень Краткий обзор, надеюсь, это немного поможет !!
Другие советы
Без сомнения, вы должны приобрести отличную книгу Дона Симэ "Эксперт F#". Книга очень хорошо написана и подходит как для начинающих, так и для экспертов. В нем вы найдете как вводной материал, так и гораздо более сложный материал. На почти 600 страницах это хорошее соотношение цены и качества.
Я обнаружил, что это научило меня многим полезным методам для написания более функциональных C#, а также предоставления всего справочного материала, необходимого мне, чтобы начать писать приложения для Windows, размещенные F#.
Книга опубликована Appress и имеет сопроводительный веб -сайт по адресу:http://www.expert-fsharp.com/default.aspx
@kronoz - Ну, большое спасибо за длинный ответ, это действительно хорошее место для начала. Я буду следить за вашими советами и ищу упомянутую книгу @Vecstasy.
А теперь дай мне кодирование :-)
let thanksalot = "thanks a lot"
printfn "%s" (thanksalot);;
Я читал Функциональное программирование реального мира
С примерами в F# и C# by: Tomas Petricek
До сих пор я нахожу это очень хорошим в обучении концепциям F#, показывая реализации в C# на стороне. Отлично подходит для программистов.
Проверьте F# Developer Center. Полем А также есть Hubfs, форум, посвященный F#.
Если у вас есть текущий релиз CTP в Visual Studio, он позволяет вам создать учебный проект F#, который дает вам учебник.
Этот учебник также указывает на более широкую коллекцию F# примеры в Microsoft.
Кроме того, существует проект F# Samples. Кодеплекс.
Надеюсь это поможет,
Михиэль