F# Language - подсказки для новичка [закрыто

StackOverflow https://stackoverflow.com/questions/36294

  •  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. Кодеплекс.

Надеюсь это поможет,

Михиэль

Первая глава моей книги F# для ученых свободно доступна здесь. Полем У нас есть серия бесплатных программ игрушек F# здесь. Полем Первая статья из нашего журнала F#.net доступна свободно здесь.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top