# F# 9의 새로운 기능

> Clean Markdown view of GeekNews topic #17697. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=17697](https://news.hada.io/topic?id=17697)
- GeekNews Markdown: [https://news.hada.io/topic/17697.md](https://news.hada.io/topic/17697.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2024-11-11T12:33:15+09:00
- Updated: 2024-11-11T12:33:15+09:00
- Original source: [learn.microsoft.com](https://learn.microsoft.com/en-us/dotnet/fsharp/whats-new/fsharp-9)
- Points: 1
- Comments: 1

## Topic Body

- 왜 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#은 [&lt;TailCall&gt;] 특성이 잘못된 곳에 사용되면 경고를 내보냄  
- 코드에는 영향이 없지만 읽는 사람을 혼란스럽게 할 수 있음  
  
### 특성 대상 적용   
- 컴파일러는 이제 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&lt;int&gt; 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# 프로젝트에서 작동함  
  
#### 파이프라인 중간에 서명 도구 설명 표시  
- 이전에는 파이프라인 중간에 있는 함수에 이미 복잡한 커리 매개변수(람다 등)가 적용된 상황에서는 서명 도움말이 제공되지 않았음  
- 이제 다음 매개변수에 대한 서명 도구 설명이 표시됨

## Comments



### Comment 31130

- Author: neo
- Created: 2024-11-11T12:33:16+09:00
- Points: 1

###### [Hacker News 의견](https://news.ycombinator.com/item?id=42101312) 
- 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](https://fsharpforfunandprofit.com/)

- Linux/MacOS에서의 F#의 상태는 어떤지 궁금함. Windows 전용인지, 아니면 완전히 지원되는 언어처럼 느껴지는지 알고 싶음
