마이너의 숙명... 자료가없다! 라이브러리도 없다! (있지만 찾기가 어렵다!)
여튼 F# 은 같은 닷넷으로 C# 라이브러리를 사용할수있는데 다른 패러다임을 가진 언어의 라이브러리를 가져다쓸때 여러가지 트러블슈팅이 발생한다..
1. 형변환
F# 에서는 :> (= upcast) 와 :?> (= downcast) 로 형변환을 한다.
C# 함수를 사용할떄에는 파라미터의 형을 변환해주어서 넘겨주는것이 좋다.
data.Append(anchor); // C#
data.Append(anchor:>element) // F#
무조건 형을 지정해줘야하는것은 아닌데.. C# 에서 오버로딩된경우 몇몇동작에서 정상적으로 안돌아가더라..,
아마 위에서 추론된 타입형식과 달라서 생기는 문제같다. 처음부터 명시적으로 지정하면 상관없을것 같지만..
대충 OpenXML 요런 문제.. 가 발생 할 수 있다.
2. Property 초기화
C# 에서는 Pubilc property를 {} 과 함께 초기화 할수있다.
F# 에서는 Property 초기화도 ()를 사용한다, 명명된 파라미터식으로 입력하면된다.
new User {Id = new ID(), PW = "1234"}; //C#
new User (Id = new ID(), PW = "1234") //F#
F# 에서 new는 옵션이므로(아마..) 빼도되지만 필자는 C# 코드 복붙해올때는 그냥 둔다...
3. Record With
이건 트러블슈팅은 아니지만.. C# 9.0 에 추가될 예정인 data 클래스 F# 의 Record 같은 놈이다.
불변 데이터를 사용하기 때문에 일부만 변경된 데이터를 생성할때 with를 사용할수있다.
var otherPerson = person with { LastName = "Hanselman" , Age = 10 }; //C#
let otherPerson = { person with LastName = "Hanselman" ; Age = 10 } //F#
4. 흔히하는 실수
C#에서는 ,(콤마) F#에서는 ; (세미콜론) 을 구분자로 사용한다. 당장 3번 항목만 봐도 그렇다.
C#에서 "==" (같다) "!=" (다르다) 이지만 F# 에서는 "=" (같다) "<>" (다르다) 이다
C#에서는 값을 변경할떄 = (초기화,변경 둘다) 을 쓰지만 F# 에서는 = 는 초기화 할당(let binding) 할때만쓰고 mutable한 변수의 값을 변경할때는 <- 을 쓴다.
5. 대문자 함수, 소문자 함수
F#에서 파스칼케이스로 시작하는 함수 (예를 들어 Int32.TryParse), 카멜케이스로 시작하는 함수 (List.tryFind) 와 같이 첫글자 대소문자가 다른것이 많다.
일종의 닷넷의 네이밍 룰 인데 전통적인 OOP 함수(= 닷넷 공통) 들 은 C#이 메인이기때문에 파스칼,
F#만의 함수는 카멜케이스로 시작한다.
즉 Int32.TryParse는 C#과 마찬가지로 bool을 리턴하고 out 으로 값을받는 함수인것이고
List.tryFind 는 FP스럽게 Option을 리턴하는 함수이다.
함수의 대문자만 보고 대충 어떤스타일의 함수인지 확인할수있다.
'프로그래밍 언어 노트 > F#' 카테고리의 다른 글
[F#/C#] Native Dll Load 하기 (0) | 2020.11.03 |
---|---|
[F#/C#] 닷넷 프레임워크 F#프로젝트 C#에서 참조하기 (0) | 2020.08.05 |
[F#] F#의 데이터 라이브러리 F# Data (0) | 2019.12.22 |
F# 파일목록 읽기, 파일의 모든 라인 읽기 (0) | 2019.12.03 |
F# 공부를 위한 사이트 (0) | 2019.11.26 |