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
인자가 여러 개일 때 들여쓰기 때문에 어색하게 줄을 끊어야 했던 불편이 확실히 줄었어요.
더 알아보기
- F# 시작하기 — F# 기본기를 처음부터 익히고 싶다면
- 원문(What's new in F# 4.7) — Microsoft Learn의 공식 문서
- 소스 문서 (GitHub) — 이 문서의 원본 마크다운
- dotnet/fsharp 저장소 — F# 컴파일러와 핵심 도구의 공식 저장소