ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 60초안에 살펴보는 F# 문법
    F# 2015. 12. 5. 00:14

    이 글은 http://fsharpforfunandprofit.com/posts/fsharp-in-60-seconds/ 

    문서를 기본으로 하여 작성되었습니다.


    표준 C언어와 비슷한 문법을 가진 언어들과 F#의 주요한 차이점.

    • 코드 블럭을 구분하기 위해 대괄호를 사용하지 않습니다. 대신 파이썬과 같이 들여쓰기를 사용합니다.
    • 컴마가 아닌 공백을 사용하여 파라미터를 구분합니다.


    주석

    // 한줄 주석은 슬래시 두개

    (* 여러줄 주석은 (* ... *) 을 이용하여 입력합니다.

       이렇게 말이죠 *)


    값 (불변)

    let myInt = 5

    let myFloat = 3.14

    let myString = "hello"  //타입을 지정하지 않아도 자유롭게 지정할 수 있습니다.


    리스트(목록)

    let twoToFive = [2;3;4;5]            //중괄호와 세미콜론으로 구분하여 목록을 표현할 수 있습니다.

    let oneToFive = 1 :: toToFive        // ::을 이용하여 새로운 첫번째 원소를 생성할 수 있습니다.

    let zeroToFive = [0;1] @ toToFive  // @ 으로 두개의 배열을 합칠수 있습니다.

    컴마는 절대 사용되지 않습니다. 오직 세미콜론만으로 구분합니다.


    함수

    let square x = x * x          //괄호가 사용되지 않습니다.

    square 3                    //함수 실행

    let add x y = x + y            //(x,y) 처럼 입력하지 않도록 주의 하세요.

    add 2 3                      //함수실행


    //여러줄로 함수 정의하기. 들여쓰기를 하면 됩니다. 세미콜론은 필요치 않아요.

    //F#에서 조건문에서의 = 은 비교 연산자입니다. 대입연산자가 아님에 주의하세요.

    let evens list = 

    let isEven x = x%2 = 0      //isEven함수를 내부에 중첩 정의 합니다.

     List.filter isEven list        //List.filter는 라이브러리 함수로  두개의 인자(비교 boolean 함수, 대상)를 취합니다.

    evens oneToFive               //함수 실행


    괄호

    //괄호를 이용하여 함수 실행 우선순위를 명시할 수 있습니다.

    //괄호로 인해 List.map 을 먼저실행하고 그 결과를 List.sum에 전달합니다.

    //아래에서 괄호가 빠지게 되면, List.sum 의 인자로 곧바로 입력되게 됩니다.

    let sumOfSquaresTo100 =

    List.sum( List.map square [1..100] )


    순방향 파이프 |> (pipe-foward)

    // |> (pipe-forward) 연산자를 이용하여 출력된 결과를 다음 함수로 전달할 수 있습니다.

    let sumOfSquaresTo100piped =

    [1..100] |> List.map square |> List.sum


    람다

    //fun 키워드를 이용하여 람다(익명함수)를 정의할 수 있습니다.

    let sumOfSquaresTo100withFun =

    [1..100] |> List.map(fun x->x*x) |> List.sum


    match ... with : 더 강력한 기능을 지원하는 switch / case 구문

    //F# 에서는 return 키워드가 필요없습니다. 마지막 값을 리턴합니다.

    let simplePatternMatch = 

    let x = "a"

    match x with

    | "a" -> printfn "x is a"

    | "b" -> printfn "x is b"

    | _ -> printfn "x is something else"    //밑줄은 아무것이나 매칭됩니다.


    Some과 None 타입 : 널 값이 가능한 값의 래퍼

    //Some(..) 과 None은 널을 허용하는 값과 비슷한 역할을 합니다. [참고]

    let validValue = Some(99)

    let invalidValue = None


    //다음 예는 Some과 None을 사용하는 match ... with의 예로 Some의 값을 바로 꺼내어 사용합니다.

    let optionPatternMatch input =

    match input with

    | Some i -> printfn "input is an int=%d" i

    | None -> printfn "input is missing"

    optionPatternMatch validValue

    optionPatternMatch invalidValue


    튜플 타입 : 복수개의 값을 가지는 형식)을 지원합니다. (컴마를 사용합니다.)

    //튜플 타입

    let twoTuple = 1,2

    let threeTuple = "a",2,true


    레코드 타입

    type Person = { First:string; Last:string }

    let person1 = { First="john"; Last="Doe" }


    유니온 타입

    type Temp =

    | DegreesC of float

    | DegreesF of float

    let temp DegreesF 98.6


    //재귀적으로 구성되어있는 타입도 가능

    type Employee =

    | Worker of Person

    | Manager of Employee list

    let jdoe = { First="John";Last="Doe"}

    let worker = Worker jdoe


    //출력

    printfn "Printing an int %i, a float %f, a bool %b" 1 2.0 true

    printfn "A string %s, and something generic %A" "hello" [1;2;3;4]

    //인자 지정 방식도 가능합니다.

    printfn "twoTuple=%A,\nPerson=%A,\nTemp=%A,\nEmployee=%A" 

             twoTuple person1 temp worker



    'F#' 카테고리의 다른 글

    F# 타이머 예제  (0) 2016.03.11
    F# Async Task 예제  (0) 2016.03.11
    F# 에서 쓰레드 사용하기 예제  (0) 2016.03.11
    웹 데이터 요청하고 xpath로 데이터 추출하기  (1) 2015.12.26
    함수형 언어 F# Hello world  (0) 2015.12.04
Designed by Tistory.