문제

여기 StackOveflow에는 다음과 같은 그룹이 있는 것 같습니다. 에프# 매니아.

나는 이 언어를 더 잘 알고 싶습니다. 함수형 프로그래밍 이론, F# 언어 사용을 시작하기 위한 더 좋은 시작점을 알려 주실 수 있나요?내 말은, 튜토리얼, 노하우, 하지만 무엇보다 먼저 작업 샘플을 통해 무언가를 시작하고 언어를 즐길 수 있는 기회를 갖습니다.

정말 감사합니다

안드레아

도움이 되었습니까?

해결책

끔찍하게 창녀는 아니지만 내 블로그에 몇 개의 F# 개요 게시물을 썼습니다. 여기 그리고 여기.Chris Smith(MS F# 팀 직원)는 '20분 안에 F#'이라는 기사를 작성했습니다. 1 부 그리고 2 부.

F#의 최신 CTP(버전 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# 코드를 정의할 때는 그런 일이 없습니다. :-)

'let' 키워드를 사용하여 함수를 정의합니다.이는 아마도 모든 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#과 같은 모든 함수형 언어의 기본 부분입니다.

패턴 일치는 정말 멋지네요. 기본적으로 스테로이드에 대한 스위치 문과 같습니다(예, 다른 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 및 else 문을 사용하여 패턴 일치를 축약할 수 있습니다.

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]

List.map 함수는 square 함수를 1부터 10까지의 목록에 '매핑'합니다. 즉,각 요소에 기능을 적용합니다.List.filter는 제공된 조건자 함수를 전달하는 목록의 값만 반환하여 목록을 '필터링'합니다.또한 'fun x -> f' 구문에 유의하세요. 이는 F# 람다입니다.

전체적으로 우리는 어떤 유형도 정의하지 않았습니다. F# 컴파일러/인터프리터는 유형을 '추론'합니다.사용법에서 원하는 것을 해결합니다.예를 들어:-

let f x = "hi " + x

여기서 컴파일러/인터프리터는 x가 문자열이어야 하는 작업을 수행하고 있으므로 x가 문자열이라고 판단합니다.또한 반환 유형도 문자열이 될지 결정합니다.

모호성이 있는 경우 컴파일러는 다음과 같은 가정을 합니다.

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)

재귀 함수를 작성하려면 let 뒤에 'rec'를 배치하여 함수를 재귀 함수로 정의해야 합니다.아래 예.

몇 가지 멋진 것들:-

계승

let rec fact x = if x <= 1 then 1 else x * fact (x-1)

n번째 피보나치 수

let rec fib n = if n <= 1 then n else fib (n-1) + fib (n-2)

피즈버즈

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")

어쨌든 그건 매우 간략한 개요, 조금이라도 도움이 되었으면 좋겠습니다!!

다른 팁

의심할 바 없이 Don Syme의 훌륭한 책 "Expert F#"을 구입해야 합니다.이 책은 매우 잘 작성되었으며 초보자와 전문가 모두에게 적합합니다.여기에서 소개 자료와 훨씬 더 어려운 자료도 찾을 수 있습니다.600페이지에 달하는 분량으로 가격대비 성능이 좋습니다.

저는 이 책이 Windows 호스팅 F# 응용 프로그램 작성을 시작하는 데 필요한 모든 참조 자료를 제공할 뿐만 아니라 보다 기능적인 C#을 작성하는 데 유용한 많은 기술을 가르쳐 주었다는 것을 알게 되었습니다.

이 책은 Apress에서 출판되었으며 다음 웹사이트에 나와 있습니다.http://www.expert-fsharp.com/default.aspx

@kronoz - 긴 답변에 감사드립니다. 시작하기에 정말 좋은 곳입니다.나는 당신의 조언에 따라 @vecstasy가 언급한 책을 찾아보겠습니다.

이제 코딩을 시작하겠습니다 :-)

let thanksalot = "thanks a lot"
printfn "%s" (thanksalot);;

나는 읽고 있었다 실제 함수형 프로그래밍

F# 및 C#의 예제 작성자:Tomas Petricek

지금까지는 C#의 구현을 측면에서 보여줌으로써 F# 개념을 가르치는 데 매우 유용하다고 생각합니다.OO 프로그래머에게 적합합니다.

확인해 보세요 F# 개발자 센터.도 있습니다 허브FS, F# 전용 포럼입니다.

Visual Studio에 최신 CTP 릴리스가 있는 경우 이름에서 알 수 있는 내용이 정확히 포함된 Tutorial.fs를 제공하는 F# Tutorial 프로젝트를 만들 수 있습니다.

이 튜토리얼은 또한 더 큰 컬렉션을 가리킵니다. Microsoft의 F# 예제.

또한 F# 샘플 프로젝트가 진행 중입니다. 코드플렉스.

도움이 되었기를 바랍니다,

미셸

내 책 F# for Scientists의 첫 번째 장은 무료로 사용할 수 있습니다. 여기.우리는 일련의 무료 F# 장난감 프로그램을 보유하고 있습니다. 여기.F#.NET Journal의 첫 번째 기사는 무료로 제공됩니다. 여기.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top