GN⁺: F# 9의 새로운 기능
(learn.microsoft.com)- 왜 F# 9가 중요한가 : F# 9는 프로그램을 더 안전하게, 탄력 있게, 성능 좋게 해주는 광범위한 개선 사항을 도입
Nullable 참조 타입
- F#은 null을 피하도록 설계되었지만, C#으로 작성된 .NET 라이브러리와 인터페이스할 때 null이 섞일 수 있음
- 이제 F#은 null을 유효한 값으로 갖는 참조 타입을 타입 안전한 방식으로 다룰 수 있게 해줌
- 예시:
-
let notAValue: string | null = null
-
let len (str: string | null) = match str with | null -> -1 | NonNull s -> s.Length
-
Discriminated Union의 .Is* 프로퍼티
- Discriminated Union은 이제 각 case마다 자동 생성된 프로퍼티를 가짐
- 이를 통해 값이 특정 case인지 확인할 수 있음
- 예를 들어
person.contact.IsEmail
과 같이 작성 가능
부분 액티브 패턴은 unit option 대신 bool을 반환 가능
- 이전에는 부분 액티브 패턴이 일치하면
Some ()
, 아니면None
을 반환했음 - 이제는 bool을 반환할 수도 있음
인수가 제공될 때 내장 프로퍼티보다 확장 메서드를 선호
- F#은 이제 타입의 내장 프로퍼티와 동일한 이름으로 정의된 확장 메서드를 해결함
- 이는 일부 .NET 라이브러리에서 볼 수 있는 패턴과 일치함
빈 몸체의 Computation Expression 지원
- F#은 이제 빈 Computation Expression을 지원함
- 예:
let xs = seq { }
- 빌더의 Zero 메서드를 호출하게 됨
해시 지시문은 문자열이 아닌 인수를 허용
- 컴파일러를 위한 해시 지시문은 이전에는 따옴표로 전달된 문자열 인수만 허용했음
- 이제는 모든 타입의 인수를 받을 수 있음
- 예:
#nowarn 0070
fsi에서 #help 지시문 확장
- F# Interactive의 #help 지시문은 이제 주어진 객체나 함수에 대한 문서를 보여줌
- 따옴표 없이 전달 가능
- 예:
#help List.map;;
경고 비활성화를 위해 #nowarn에서 FS 접두사 지원
- 이전에는
#nowarn "FS0057"
을 작성하면 잘못된 경고 번호라는 메시지가 나왔음 - 이제는 접두사가 있어도 경고 번호가 허용됨
재귀적이지 않은 함수나 let으로 바인딩된 값에 TailCall 특성 사용 시 경고
- 이제 F#은 [<TailCall>] 특성이 잘못된 곳에 사용되면 경고를 내보냄
- 코드에는 영향이 없지만 읽는 사람을 혼란스럽게 할 수 있음
특성 대상 적용
- 컴파일러는 이제 let 값, 함수, union case 선언, 암시적 생성자, 구조체 및 클래스에 대한 AttributeTargets를 올바르게 적용함
- 이는 Xunit 테스트에 unit 인수를 추가하는 것을 잊는 등의 버그를 방지할 수 있음
표준 라이브러리 업데이트
컬렉션을 위한 Random 함수
- List, Array, Seq 모듈에 랜덤 샘플링과 셔플을 위한 새로운 함수가 추가됨
- 암시적이고, 스레드 안전한 공유 Random 인스턴스를 사용하는 버전
- Random 인스턴스를 인수로 받는 버전
- 사용자 지정 randomizer 함수를 받는 버전
- Shuffle, Choice, Choices, Sample 함수가 있음
CustomOperationAttribute의 Parameterless 생성자
- Computation Expression 빌더를 위한 사용자 지정 연산을 더 쉽게 만들 수 있음
- 명시적으로 이름을 지정하지 않아도 됨(대부분의 경우 이름이 메서드 이름과 일치함)
F# List와 Set에 대한 C# 컬렉션 식 지원
- F# List와 Set을 C#에서 사용할 때 컬렉션 식으로 초기화할 수 있음
- 예:
FSharpSet<int> mySet = [ 1, 2, 3 ];
개발자 생산성 향상
파서 복구
- 파서 복구에 지속적인 개선이 이루어짐
- 코드 편집 중이어서 항상 구문적으로 올바르지 않더라도 도구가 계속 작동함
진단
- F# 9에는 새롭거나 개선된 진단 메시지가 많이 있음
- 모호한 오버라이드 메서드, 추상 멤버 사용 시, 중복된 필드가 있는 유니언 등
실제 가시성
- F#에서 어셈블리를 생성하는 방식에는 private 멤버가 IL에 internal로 작성되는 문제가 있음
- 이제
--realsig+
컴파일러 플래그로 이 동작을 수정할 수 있음
성능 개선
최적화된 동등성 검사
- 동등성 검사가 이제 더 빨라지고 메모리 할당이 줄어듦
구조체 Discriminated Union의 필드 공유
- 구조체 DU의 여러 case에서 동일한 이름과 타입의 필드를 갖는 경우 동일한 메모리 위치를 공유할 수 있음
- 이는 구조체의 메모리 공간을 줄여줌
정수 범위 최적화
- 컴파일러는 이제
start..finish
와start..step..finish
식의 더 많은 인스턴스에 대해 최적화된 코드를 생성함 - 이전에는 타입이 int/int32이고 스텝이 상수 1이나 -1일 때만 최적화되었음
- 이제 모든 정수 타입과 다른 스텝 값도 최적화됨
List/Array Comprehension의 for x in xs -> ... 최적화
- List와 Array의 컴프리헨션에서
for x in xs -> ...
가 최적화되었음 - 특히 Array에서 최대 10배 속도 향상과 1/3에서 1/4 수준의 할당 크기 감소
도구 개선
Visual Studio의 Live Buffer
- 이전에는 옵트인 기능이었지만 이제 기본적으로 활성화됨
- IDE의 백그라운드 컴파일러가 이제 라이브 파일 버퍼로 작동함
- 변경 사항을 적용하기 위해 파일을 디스크에 저장할 필요가 없음
불필요한 괄호 제거를 위한 분석기와 코드 수정
- 명확성을 위해 추가 괄호가 사용되기도 하지만 때로는 그냥 노이즈임
- 이제 Visual Studio에서 괄호를 제거하기 위한 코드 수정을 제공함
Visual Studio에서 F#에 대한 사용자 지정 시각화 도우미 지원
- Visual Studio의 디버거 시각화 도우미가 이제 F# 프로젝트에서 작동함
파이프라인 중간에 서명 도구 설명 표시
- 이전에는 파이프라인 중간에 있는 함수에 이미 복잡한 커리 매개변수(람다 등)가 적용된 상황에서는 서명 도움말이 제공되지 않았음
- 이제 다음 매개변수에 대한 서명 도구 설명이 표시됨
Hacker News 의견
-
F#는 대학 시절 처음 접한 이후로 가장 좋아하는 언어임. C#보다 앞선 기능들을 가지고 있으며, C#도 이러한 기능들을 도입하고 있지만 호환성 문제로 어려움이 있음. F#은 여전히 훌륭한 언어이며, .NET 생태계와 호환 가능하며 적은 보일러플레이트로 C#과 동등한 성능을 제공할 수 있음
-
F#는 Microsoft가 Excel 이후로 출시한 최고의 제품 중 하나로, .NET을 합리적인 플랫폼으로 변환함
-
F#을 기반으로 한 Phosphor 프로젝트에 큰 투자를 했으나, Typescript와 Rust로 전면 재작성하게 됨. Fable 라이브러리를 통해 다양한 기술 간의 타입 안전성을 유지하려 했으나, 라이브러리 간의 상호 운용성 문제와 의존성 관리가 어려웠음. F#은 전통적인 프론트엔드/백엔드 구분이 있는 경우에만 적합하다고 생각함
- 현재 내부적으로 사용하는 기술 중 가장 흥미로운 것은 Effect 라이브러리와 Moonbit임. Moonbit는 MS/.NET 의존성이 없는 현대적인 F# 버전으로, AI 중심의 세계에 적합한 언어로 기대됨
-
.NET을 사용하는 언어를 선택할 수 있는 암호학 수업에서 F#로 작성한 과제가 다른 사람들보다 읽기 쉬웠음. 데이터 과학 작업의 거의 100%가 Python으로 이루어져 있어 F#을 더 많이 사용하지 못함
-
F#에서 작업하는 것이 그립지만, 업데이트를 계속 주시하고 있음. 도구는 커뮤니티의 크기와 Microsoft의 무관심에도 불구하고 꽤 좋았음. 가장 큰 문제는 코드 테스트 커버리지의 정확성이었음
-
최근에 F#을 사용해봤는데, Python에서 온 사람으로서 REPL을 사용할 수 있다는 점이 마음에 듦. 겨울에 작은 웹 백엔드 프로젝트를 만들어 언어와 생태계를 더 잘 알고 싶음. http 부분에 대해 Oxpecker에 대해 좋은 이야기를 들었음
-
F#의 버전 관리 방식에 대해 궁금함. 품질 개선이 많지만, 주요 버전 변경이 필요해 보이지 않음. .NET9와의 버전 번호 일치가 이유인지 궁금함
-
F#이 Windows에서 GUI 앱을 만들기 위한 C#의 대체재로서의 상태는 어떤지, 이를 위해 F#을 사용하는 회사가 있는지 궁금함
-
F#을 해본 적은 없지만, 좋은 리소스로 보이는 사이트를 발견함: fsharpforfunandprofit.com
-
Linux/MacOS에서의 F#의 상태는 어떤지 궁금함. Windows 전용인지, 아니면 완전히 지원되는 언어처럼 느껴지는지 알고 싶음