F# 4.7의 새로운 기능

F# 4.7의 새로운 기능

F# 4.7은 언어에 여러 가지 개선을 더해 줍니다. 기능 하나하나가 크진 않지만, 막상 쓰면 코드가 훨씬 가벼워지는 것들이에요. 실제로 뭐가 어떻게 달라졌는지 하나씩 살펴볼게요.

출처: What's new in F# 4.7 - Microsoft Learn (한국어 번역/요약)

본문

시작하기 (Get started)

F# 4.7은 모든 .NET Core 배포판과 Visual Studio 도구에서 사용할 수 있어요. F#을 처음 접한다면 F# 시작하기 문서부터 읽어 보면 좋아요.

언어 버전 (Language version)

F# 4.7 컴파일러부터는 프로젝트 파일에 속성 하나만 적으면 유효 언어 버전(effective language version) 을 직접 지정할 수 있게 됐어요.

<PropertyGroup>
    <LangVersion>preview</LangVersion>
</PropertyGroup>

4.6, 4.7, latest, preview 값을 쓸 수 있고, 기본값은 latest예요.

여기서 preview로 설정하면 컴파일러가 현재 컴파일러에 구현되어 있는 모든 F# 미리 보기(preview) 기능을 활성화해요. 새 기능을 미리 실험해 보고 싶을 때 유용하죠.

암시적 yield (Implicit yields)

배열, 리스트, 시퀀스 또는 계산 식(computation expression)에서 타입이 추론될 수 있는 경우에는 이제 yield 키워드를 굳이 붙이지 않아도 돼요.

아래 예시를 볼게요. F# 4.7 이전에는 두 코드 모두 항목마다 yield 문을 일일이 써 줘야 했어요.

let s = seq { 1; 2; 3; 4; 5 }

let daysOfWeek includeWeekend =
    [
        "Monday"
        "Tuesday"
        "Wednesday"
        "Thursday"
        "Friday"
        if includeWeekend then
            "Saturday"
            "Sunday"
    ]

여기서 주의할 점이 하나 있어요. yield 키워드를 하나라도 넣기 시작하면, 나머지 항목에도 모두 yield를 붙여야 해요. 섞어 쓰면 안 된다는 거죠.

또 하나, 시퀀스를 평탄화(flatten)하기 위해 yield!를 쓰는 식 안에서는 암시적 yield가 적용되지 않아요. 그런 경우에는 지금도 계속 명시적으로 yield를 써 줘야 해요.

와일드카드 식별자 (Wildcard identifiers)

클래스가 관련된 F# 코드에서는 멤버 선언에 self-identifier를 항상 명시해 줘야 해요. 그런데 막상 self-identifier를 전혀 쓰지 않는 경우도 많죠. 예전에는 그럴 때 관례상 이중 밑줄(double-underscore) 로 "이름 없는 self-identifier"를 표현했어요. 이제는 밑줄 하나면 충분해요.

type C() =
    member _.M() = ()

이건 for 루프에도 동일하게 적용돼요.

for _ in 1..10 do printfn "Hello!"

들여쓰기 완화 (Indentation relaxations)

F# 4.7 이전에는 주 생성자(primary constructor)와 정적 멤버(static member) 인자의 들여쓰기 요건이 지나치게 엄격했어요. 이제는 들여쓰기 스코프 하나만 맞춰 주면 됩니다.

type OffsideCheck(a:int,
    b:int, c:int,
    d:int) = class end

type C() =
    static member M(a:int,
        b:int, c:int,
        d:int) = 1

인자가 여러 개일 때 들여쓰기 때문에 어색하게 줄을 끊어야 했던 불편이 확실히 줄었어요.

더 알아보기