F #을 사용해야하는 14 가지 이유

F #은 간단한 코드를 작성하여 복잡한 문제를 해결할 수있는 강력한 형식의 기능 우선 프로그래밍 언어입니다. ML을 기반으로하고 .NET Framework를 기반으로 구축 된 F #은 우수한 상호 운용성, 이식성 및 런타임 속도뿐만 아니라 "5 가지 C"(간결성, 편의성, 정확성, 동시성 및 완전성)를 제공합니다.

F #은 처음에는 Microsoft Research 프로젝트로 Windows에서만 사용할 수 있었지만 이제는 여러 플랫폼에서 일류 언어입니다. Xamarin Studio, MonoDevelop, Emacs 등의 도구 지원과 함께 Mac 및 Linux에서 F #을 사용할 수 있습니다. Visual Studio, Xamarin Studio 및 Emacs가있는 Windows에서 Android 및 iOS 기기와 HTML5를 사용하는 웹에서. 범용 프로그래밍 외에도 F #은 GPU 코드, 빅 데이터, 게임 등에 적용 할 수 있습니다.

F #을 사용하는 이유는 무엇입니까? 14 가지 이유를 말씀 드리겠습니다.

F #은 대화 형입니다.

F #의 장점 중 하나는 아래 화면 이미지와 같이 코드를 시험해 볼 수있는 대화 형 REPL (읽기, 평가, 인쇄, 루프)이 있다는 것입니다. 시계 방향으로 왼쪽 상단부터 Windows의 Visual Studio, Chrome에서 실행중인 TryFSharp 및 Mac OS X에서 실행되는 Xamarin Studio의 F # Interactive 창이 표시됩니다 ;;. TryFSharp에서 "실행"버튼은 동일한 신호를 보냅니다. 전체 프로그램에 들어가기 전에 REPL을 사용하여 코드를 컴파일하고 테스트하면 개발 속도를 높이고 버그를 줄일 수 있습니다.

F #은 스크립팅 용입니다.

F #은 프로그래밍 언어뿐만 아니라 스크립팅 언어로도 사용할 수 있습니다. 아래에는 F # 스크립트가 4 개의 F # 프로그램 파일을로드하고 자체 코드를 실행하기 전에 2 개의 .NET 라이브러리를 여는 Visual Studio 샘플이 있습니다. [|…|]여기에 사용 된 표기법 은 배열을 선언합니다. 표기법 |>은 왼쪽의 결과를 오른쪽의 함수로 전달하는 전방 파이프입니다. 여기서 새로운 줄은 구문 적으로 중요하지 않습니다. 한 줄에 전체 파이프 식을 사용하는 것보다 코드를 더 쉽게 읽을 수 있습니다.

F #이 작동합니다.

F #은 함수를 값으로 처리, 식에서 명명되지 않은 함수 사용, 새 함수를 형성하는 함수 구성, 커리 함수 및 함수 인수의 부분적 적용을 통한 함수의 암시 적 정의와 같은 함수형 프로그래밍 구문을 지원합니다. 아래의 상단 스크린 샷에서 add함수를 정의하고 사용합니다 . 함수의 본문은 들여 쓰기 (예 : Python)되고 인수 유형은 +연산자로 인해 정수로 유추됩니다 . 하단 스크린 샷에서는 콜론과 형식 이름을 사용하여 인수 이름 뒤에 형식 주석을 제공하므로 F # phrase은 이것이 string형식 임을 인식 합니다.

F #은 간결합니다.

아래 코드는 F # (Scott Wlaschin 작성)으로 구현 된 Quicksort와 유사한 알고리즘입니다. rec키워드는 함수가 재귀 있음을 나타냅니다. match..with구문은이다 switch스테로이드에 문을 |나타내는 경우. 는 []빈 상태 (empty)의리스트를 나타냅니다. firstElem및이 otherElements자동으로 생성됩니다.

코드 어디에도 언급 된 유형 선언이 없습니다. 즉, 함수는 비교 연산자를 지원하는 모든 유형을 포함하는 목록을 정렬 할 수 있습니다. 이 fun키워드는 익명의 람다 함수를 정의하기위한 것입니다.

rec quicksort 목록을 보자 =

   일치 목록

   | []-> // 목록이 비어있는 경우

        [] // 빈 목록 반환

   | firstElem :: otherElements-> // 목록이 비어 있지 않은 경우 

        let smallElements = // 더 작은 것을 추출

            otherElements            

            |> List.filter (재미-> e <firstElem)

            |> quicksort // 정렬

        let largerElements = // 큰 것을 추출

            otherElements

            |> List.filter (재미-> e> = firstElem)

            |> quicksort // 정렬

        // 세 부분을 새 목록으로 결합하고 반환

        List.concat [smallerElements; [firstElem]; largeElements]

//테스트

printfn "% A"(빠른 정렬 [1; 5; 23; 18; 9; 1; 3])

비교를 위해 아래의 기존 C # 구현을 살펴보십시오.

공용 클래스 QuickSortHelper

{

   공용 정적 목록 QuickSort (목록 값)

      여기서 T : IComparable

   {

      if (values.Count == 0)

      {

         return new List ();

      }

      // 첫 번째 요소 가져 오기

      T firstElement = 값 [0];

      // 작고 큰 요소를 가져옵니다.

      var smallElements = new List ();

      var largeElements = new List ();

      for (int i = 1; i <values. Count; i ++) // i는 1에서 시작

      {// 0이 아닙니다!

         var elem = values ​​[i];

         if (elem.CompareTo (firstElement) <0)

         {

            smallElements.Add (elem);

         }

         그밖에

         {

            largeElements.Add (elem);

         }

      }

      // 결과 반환

      var result = new List ();

      result.AddRange (QuickSort (smallerElements.ToList ()));

      result.Add (firstElement);

      result.AddRange (QuickSort (largerElements.ToList ()));

      반환 결과;

   }

}

F # 코드와 비교하여 C # 코드가 얼마나 더 복잡했는지 알 수 있습니다. 

F #은 정말 간결합니다.

Scott Wlaschin에 따르면 아래에 표시된 quicksort 버전 (4 줄 모두)은 숙련 된 기능 코더가 작성한 F #의 전형적인 간결한 모양을 가지고 있습니다. 물론 그는 그것이 제자리에 정렬되지 않는다는 것을 가장 먼저 지적 할 것입니다. 코드를 이해하기 위해 여러 번 읽어야했지만 그만한 가치가있었습니다.

rec quicksort2 = 기능하자

   | []-> []                        

   | first :: rest->

        더 작게, 더 크게 = List.partition ((> =) 먼저) 나머지

        List.concat [quicksort2 small; [먼저]; quicksort2 크게]

// 테스트 코드 

printfn "% A"(quicksort2 [1; 5; 23; 18; 9; 1; 3])

간단히 말해서, 첫 번째 케이스는 통과 된 경우 빈 목록을 반환하여 종료 기준을 제공합니다. 두 번째 경우는 목록을 첫 번째 요소와 나머지 요소로 분할하여 더 작은 값으로 시작하는 하위 목록을에 할당 smaller하고 다른 하위 목록을에 할당합니다 larger. 하위 목록 의 연결 내에서 함수는 smallerlarger목록을 재귀 적으로 정렬 합니다.

F #은 강력한 타이핑을 통해 버그를 줄입니다.

JavaScript, Ruby 및 Python과 달리 F #은 동적 형식이 아니라 강력한 형식입니다. 강력한 형식이지만 모든 형식을 선언해야하는 C 및 C ++와 달리 F #은 가능할 때마다 형식 유추를 수행합니다. 형식 추론이 불가능하지만 형식을 알아야하는 경우 F # 컴파일러는 함수 에 대한 (phrase:string)인수 에 대한 이전 예제에서했던 것처럼 오류를 발생시키고 형식 주석을 제공하도록 제안 toHackerTalk합니다. 컴파일 타임에 유형 불일치를 포착하면 동적으로 유형이 지정된 언어가 발생하기 쉬운 전체 런타임 오류 클래스가 제거됩니다.

그건 그렇고, F # let바인딩은 특별히 선언하지 않는 한 변경할 수 없습니다 mutable.

F #에는 List, String 및 Array를 포함하여 잘 선택된 대규모 개체 집합이 있습니다.

아래 IntelliSense에서 볼 수 있듯이 F #에는 .NET Framework를 기반으로하는 풍부한 목록, 문자열 및 배열 모듈이 있습니다. 이 점에서 가장 중요한 기능적 언어이지만 객체 지향 언어이기도합니다. 모듈 이름을 사용하든 입력 된 변수 이름을 사용하든 상관 없습니다. 점을 추가하면 멤버 함수가 팝업됩니다. 어떤 사람들은 명시 적으로 모듈 이름을 사용하는 것이 점으로 구분 된 변수보다 기능적 언어에 더 나은 스타일이라고 주장하지만, 그 인수를 완전히 구입하지는 않습니다.

F #은 MapReduce에 유용합니다.

MapReduce는 빅 데이터에서 자주 사용되는 효율적인 2 단계 프로세스이며 Hadoop에서 명시 적으로 지원됩니다. 이 F # 예제에서는 정수 목록을 매핑하고 줄입니다. 먼저 목록을 짝수로 필터링 한 다음 각 숫자를 두 배로 늘린 다음 마지막으로 목록에있는 모든 요소의 합계를 가져와 결과를 집계하거나 줄입니다. List.map강력한 고차 함수입니다. 고차 함수는 다른 함수를 인수로 취하는 함수입니다. 목록 및 배열 외에도 F #은 레코드, 시퀀스, 데이터 형식 공급자 및 LINQ (언어 통합 쿼리)를 지원합니다.

F #에는 레코드가 있습니다.

F # 레코드는 선택적으로 멤버가있는 명명 된 값의 단순 집계를 나타냅니다. 아래 예에서는 먼저 Book4 개의 명명 된 값 으로 레코드 유형을 정의한 다음 동일한 4 개의 이름을 사용하여 레코드를 만듭니다. F # 컴파일러 Book는 이름을 일치시켜 형식을 올바르게 유추합니다 .

F # 레코드는 선택적 값을 가질 수 있습니다.

레코드는 항상 모든 명명 된 값을 포함 할 필요는 없습니다. option유형을 정의 할 때 이름 지정된 값에 속성을 제공하면 레코드에서 제외 될 수 있습니다. 선택적 값을 설정할 때 None으로 끝나는 null이거나 Some설정하려는 값이 뒤에 올 수 있습니다 . 레코드 필드는 속성으로 자동으로 노출된다는 점에서 클래스와 다릅니다. F #의 클래스와 구조는 C # 및 Visual Basic .NET과 호환되는 .NET 클래스 및 구조이므로 예제는 생략하겠습니다.

F #에는 시퀀스가 ​​있습니다.

F #의 시퀀스는 하나의 유형으로 구성된 논리적 일련의 요소입니다. 시퀀스는 순서가 지정된 대규모 데이터 모음이 있지만 반드시 모든 요소를 ​​사용할 것으로 예상하지 않을 때 특히 유용합니다. 개별 시퀀스 요소는 필요한 경우에만 계산되므로 모든 요소가 사용되지 않는 상황에서 시퀀스가 ​​목록보다 더 나은 성능을 제공 할 수 있습니다. 이 Seq모듈은 시퀀스와 관련된 조작을 지원합니다. 아래 이미지에서는 간단한 시퀀스, 표현식이있는 시퀀스, 필터가있는 시퀀스를 보여줍니다.

F #은 데이터 공급자 및 LINQ를 지원합니다.

아래에서는 TryFSharp 편집기를 사용하여 온라인 Freebase 기상 데이터 세트를 열고 데이터 공급자에게 가장 높은 바람 값을 기록한 사이클론을 쿼리합니다. query { }구문 구현은 F 번호에 대한 LINQ. 이 DLL의 사용은 TryFSharp에만 해당됩니다. Visual Studio open Microsoft.FSharp.Data.TypeProviders에서 적절한 데이터 공급자 서비스를 사용합니다.

결과:

 [Hurricane Andrew; Hurricane Hugo; 1900 Galveston hurricane;

   Tropical Storm Allison; Cyclone Tracy; Hurricane Iniki; Hurricane Ivan;

   1999 Odisha cyclone; Hurricane Katrina; Typhoon Talim; Hurricane Rita;

   Typhoon Herb; Hurricane Wilma; Typhoon Vera; 1962 Pacific typhoon season;

   Typhoon Ike; Typhoon Mireille; Typhoon Babe; Tropical Storm Arlene;

   Hurricane Irene; Typhoon Zeb; Typhoon Maemi; Typhoon Bess; Typhoon Chanchu;

   Typhoon Patsy; Typhoon Ewiniar; Hurricane Ioke; Typhoon Xangsane;…

F #은 Hadoop 데이터를 분석 할 수 있습니다.

이 예제에서는 TryFsharp 편집기를 사용하여 측정 단위 주석과 함께 홍채 꽃 기능의 측정 값을 포함하는 Hadoop Hive 인스턴스를 엽니 다. 따라서 .NET Framework의 속성에서 단위 주석 사용을 활성화했습니다 HiveTypeProvider.

이 계산은 다음을 반환합니다.

val avgPetalLength : float = 0.0374966443

F #은 패턴 일치를 수행합니다.

F # match식은 식과 패턴 집합의 비교를 기반으로하는 분기 제어를 제공합니다. 아래 예의 1-7 행은 재귀 isPalindrome함수를 정의 합니다. 8-10 행 isPalindrome은 전체 문자열을 사용하여 처음 호출 하는 래퍼 함수를 ​​정의 합니다. "aba"는 회문이므로 then9 행 의 절이 실행되고를 반환 Some s하고 match11 행 의 문은 "The string aba is palindrome"을 생성합니다. _ pattern에서 라인 (14)은 기본 경우입니다.

match..|F 번호의 문을 통해 많은 혜택이 switch..caseC #에서 문을입니다 가장 중요한있는 C ++, 자바, 그것은 적은 버그를 유발한다는.

F #은 비동기 워크 플로를 지원합니다.

F #은 모든 .NET Framework에 액세스 할 수 있지만 비동기 워크 플로를위한 자체 구문도 있습니다. async { expression }구문 비 블로킹 연산을 정의한다. do!키워드 결과에 대한 비동기 작업 대기를 행한다. let!비동기 작업 및 양수인 결과에 키워드를 기다립니다. 그리고 use!비동기 작업을 기다렸다가 결과를 할당하고 리소스를 해제합니다. Async.RunSynchronously비동기 작업을 실행하고 그 결과를 기다립니다. 병렬 처리를 추가하려면 객체 Async.Parallel목록을 가져 와서 병렬로 실행할 AsyncAsync작업 객체 의 코드를 설정 Async하고 병렬 계산을 나타내는 객체를 반환하는 함수를 사용 합니다. 그런 다음 그 결과를 Async.RunSynchronously. (아래 예는재미와 이익을위한 F # .)

F # 리소스

F #에 대한 자세한 내용은 아래 링크를 참조하십시오.

  • F # 시도
  • 재미와 이익을위한 F #
  • F # 언어 참조
  • 실제 함수 프로그래밍
  • Amazon의 F # 도서
  • F # 3 백서
  • 추가 참조