본문 바로가기

프로그래밍 언어 노트/F#

[F#] C# to F#, troubleshooting

마이너의 숙명... 자료가없다! 라이브러리도 없다! (있지만 찾기가 어렵다!)

여튼 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을 리턴하는 함수이다.

함수의 대문자만 보고 대충 어떤스타일의 함수인지 확인할수있다.

728x90