2010-12-08 2 views
6

나는 F #을 배우는 것에 관심이 많습니다.F #을 배우면서 배울 점,

기능 언어에 대한 나의 경험은 대학에서 Scheme에 대한 2 개의 입문 과정이었습니다.

이전에 학습 된 Scheme을 가지고 F #을 학습하는 동안 유의해야 할 사항이 있습니까? 방법론, 잡았다 또는 다른 문제가 있으면 문제가 생길 수 있습니까?

답변

3

스키마는 유용한 기능 언어입니다. 학교에서 그것을 배우는 것은 기능적 프로그래밍을위한 좋은 기반을 제공해야합니다.

F #은 정적 형식이지만 Scheme은 동적이므로 한 가지 분명한 차이점이 있습니다. 다른 정적 언어 (특히 C#과 같은 .NET 언어)를 사용해 본 경험이 있다면 큰 문제는 아니지만 대부분의 경험이 역동적이라면 변경 될 것입니다.

주요 F # 함수 프로그래밍 함수 (예 : List.map)의 이름을 익히는 것이 중요합니다. 대부분의 모든 기능 언어는 동일한 기본 집합을 가지고 있지만 종종 다른 이름을 사용합니다 (필자는 비교할 주요 스키마 이름을 기억하지 않습니다).

샘플 입력/출력이있는 오래된 프로그래밍 '프로그래밍 할당'을 사용하면 언어로 '워밍업'하는 방법으로 F #에서 다시 코딩하는 것이 유용 할 수 있습니다.

5

이전에 학습 된 Scheme을 가지고 F #을 학습하는 동안 유의해야 할 사항이 있습니까? 방법론, 잡았다 또는 다른 문제가 있으면 문제가 생길 수 있습니까?

정적 입력은 Scheme과 F #의 주요 차이점입니다. 이것은 유형 프로그래밍을 용이하게합니다 형식 시스템은 함수 및 데이터에 대한 제약 조건을 인코딩하는 데 사용되므로 컴파일러가 컴파일 시점에 프로그램의 이러한 측면을 올바로 증명하고 제약 조건 위반이 즉시 포착되도록합니다.

는 예를 들어, 동일한 유형의 하나 개 이상의 요소의 순서는 다음과 같은 유형의 값에 의해 전달 될 수 있습니다

type list1<'a> = List1 of 'a * 'a list 

let xs = List1(1, []) 
let ys = List1(2, [3; 4]) 
컴파일러는 지금 어떤 시도가 이들의 빈 하나를 사용하는 것을 보장

시퀀스는 컴파일 타임에 오류로 발견됩니다. 우리의 새로운 순서로

> List.reduce (+) [];; 
System.ArgumentException: The input list was empty. 
Parameter name: list 
    at Microsoft.FSharp.Collections.ListModule.Reduce[T](FSharpFunc`2 reduction, FSharpList`1 list) 
    at <StartupCode$FSI_0271>[email protected]() 
Stopped due to error 

다음은 내장 된 목록에 대한 구현 예외가 런타임에 barfs 있도록 빈 순서가 발생하면

이제 reduce 함수는 빈 순서에 이해되지 않는다

let rec reduce f = function 
    | List1(x, []) -> x 
    | List1(x0, x1::xs) -> f x0 (reduce f (List1(x1, xs))) 

이것은 좋은 방법입니다 : 하나 개 이상의 요소, 우리는 이제 입력이 비어 있지 않은 것으로 타입 시스템에 의해 보장되어 있기 때문에 예외가 런타임에 barfs 결코 reduce 기능을 쓸 수 있습니다 신뢰성을 높이기 위해 런타임 오류의 원인을 제거하여 소프트웨어의 복잡성을 없애고 Scheme과 같이 동적으로 형식을 지정하는 언어도 시작할 수 없습니다.

+0

철저히 답변 해 주셔서 감사합니다. 첫 번째 코드 예제에 대해 약간 불명확합니다. 무엇을하는지 명확하게 설명해주십시오. –

+0

첫번째 코드 예제는 타입 변수''a'에 이어'list1'라고 불리는 타입을 정의합니다. 타입''a1''에 이어''list1 ' 타입의 예제 값은'[1]'과'[2; 3; 4]. –

+0

신난다, 그것은 나에게 완전한 의미를 가진다. 귀하의 명확한 주셔서 감사합니다 :) –

1

나는 하스켈도 고려해보기를 권하고, 그들은 F #과 ML과 거의 같은 가족에 속하며, 하스켈은 다른 곳에없는 흥미로운 기능적 개념을 많이 포함하고있다.

양방향 온라인 튜토리얼을 보려면 tryhaskell.org를보십시오.