{{위키데이터 속성 추적}}
{{잘못된 제목|제목=F#}}
{{프로그래밍 언어 정보
|이름 = F#
|로고 = Fsharp logo.png
|패러다임 = [[다중 패러다임 프로그래밍 언어|다중 패러다임]] ([[함수형 프로그래밍|함수형]], [[명령형 프로그래밍|명령형]], [[객체 지향 프로그래밍|객체 지향]], [[제네릭 프로그래밍|제네릭]], [[메타 프로그래밍|메타]], [[병행 컴퓨팅|병행]])
| released = 2005년, 버전 1.0
|설계자 = [[마이크로소프트]], F 샤프 소프트웨어 재단
| latest_release_version = {{wikidata|property|reference|edit|Q648619|P348}}
| latest_release_date = {{wikidata|qualifier|Q648619|P348|P577}} ({{Time ago| {{wikidata|qualifier|raw|Q648619|P348|P577}} }})
| latest preview version = 5.0 프리뷰
| latest preview date = {{시작 날짜와 나이|2019|04|02}}<ref>https://www.infoq.com/news/2019/04/FSharp-Nulls</ref>
|형 체계 = [[자료형 체계#정적 정형|정적]]
|영향을 받은 언어 = [[ML]], [[OCaml]], [[C 샤프|C#]], [[파이썬]], [[하스켈]], [[스칼라 (프로그래밍 언어)|스칼라]]
|영향을 준 언어 = 
|운영 체제 =
|라이선스 = 
}}
'''F#'''(에프 샤프)는 강타입 함수형 우선 다중패러다임 언어이다. 주로 [[공통 언어 기반]] 크로스 플랫폼으로 사용되며, [[자바스크립트]]<ref>{{저널 인용|제목=A Framework for Cross-Platform Mobile Web Applications Using HTML5|성=Bouras|이름=Christos|성2=Papazois|이름2=Andreas|url=http://dx.doi.org/10.1109/ficloud.2014.75|날짜=2014-08|출판사=IEEE|doi=10.1109/ficloud.2014.75|isbn=978-1-4799-4357-9|성3=Stasinos|이름3=Nikolaos}}</ref>나 GPU 코드<ref>{{저널 인용|제목=Information Visualization of Multi-dimensional Cellular Automata using GPU Programming|성=Gobron|이름=Stephane|성2=Mestre|이름2=Daniel|url=http://dx.doi.org/10.1109/iv.2007.69|날짜=2007-07|출판사=IEEE|doi=10.1109/iv.2007.69|isbn=0-7695-2900-3}}</ref> 생성에도 사용할 수 있다.

F# 소프트웨어 재단<ref>{{저널 인용|제목=On the reproducibility of empirical software engineering studies based on data retrieved from development repositories|저널=Empirical Software Engineering|성=González-Barahona|이름=Jesús M.|성2=Robles|이름2=Gregorio|url=http://dx.doi.org/10.1007/s10664-011-9181-9|날짜=2011-10-18|권=17|호=1-2|쪽=75–89|doi=10.1007/s10664-011-9181-9|issn=1382-3256}}</ref>이나 [[마이크로소프트]], 오픈소스 기여자에 의해 개발된다. F# 소프트웨어 재단에서 만든 오픈소스 크로스 플랫폼 컴파일러가 있다.<ref>{{저널 인용|제목=GitHub und Open Source Software|저널=Computer und Recht|url=http://dx.doi.org/10.9785/cr-2019-350626|날짜=2019-06-01|권=35|호=6|쪽=r69–r69|doi=10.9785/cr-2019-350626|issn=2194-4172}}</ref> [[마이크로소프트 비주얼 스튜디오|비주얼 스튜디오]]<ref>{{저널 인용|제목=functional programming language|url=http://dx.doi.org/10.1007/springerreference_15201|출판사=Springer-Verlag|위치=Berlin/Heidelberg}}</ref>나 [[자마린]] 스튜디오<ref>{{서적 인용|url=http://dx.doi.org/10.4135/9781483380506.n46|제목=European Commission on Slow Growth and New Investment Plans: August 28 and November 26, 2014|출판사=CQ Press|위치=2300 N Street, NW,  Suite 800,  Washington  DC  20037  United States|쪽=418–427|isbn=978-1-4833-8052-0}}</ref>에서도 지원한다. 다른 프로그램으로는 [[모노 (소프트웨어)|Mono]], [[MonoDevelop]], SharpDevelop, MBrace, WebShaper 등이 있다. 테스트 에디터에서도 플러그인 형식으로 지원하며, 특히 Atom, VSCode, Vim, Emacs, Rider 등에서 지원한다.

F#은 ML 계열의 언어이며, [[닷넷 프레임워크]]의 [[OCaml]] 구현체로 시작했고,<ref>{{서적 인용|url=http://dx.doi.org/10.1016/b978-0-12-387737-6.50006-6|제목=Acknowledgements|날짜=2012|출판사=Elsevier|쪽=11|isbn=978-0-12-387737-6}}</ref><ref>{{저널 인용|제목=Leveraging .NET meta-programming components from F#|성=Syme|이름=Don|url=http://dx.doi.org/10.1145/1159876.1159884|날짜=2006|출판사=ACM Press|위치=New York, New York, USA|doi=10.1145/1159876.1159884|isbn=1-59593-483-9}}</ref> [[C 샤프|C#]], [[파이썬]], [[하스켈]], [[스칼라 (프로그래밍 언어)|스칼라]], [[얼랭]]에서 영향을 받았다.

== 문법 ==
=== F# 함수의 형태 ===
함수형 프로그래밍의 "Hello World"라고 할 만한 것은 [[계승 (수학)|팩토리얼]]을 계산하는 코드이다. F# 으로는 다음과 같이 표현할 수 있다.
<syntaxhighlight lang='fsharp'>
let rec fact n =
    match n with
    | 0 -> 1
    | _ -> n * fact (n-1);;
</syntaxhighlight>
이 코드는 팩토리얼을 재귀 함수로 정의한 것이다. 일반적으로 함수를 정의할 때는 let ... 와 같이 쓰고, 재귀함수를 정의할 때는 let rec ... 와 같이 명시한다. 함수의 마지막에는 두 개의 세미콜론으로 끝마침을 해 준다.

위 함수 정의는 수학 교과서에서 볼 수 있는 팩토리얼의 정의와 비슷하다. F# 코드는 문법과 계산방식의 측면에서 수학적 언어와 닮았다.

F# 은 자동으로 타입을 유추한다. 위의 fact 함수는 (int -> int) 타입 즉, 정수를 인자로 받아 또 다른 정수를 반환하는 함수이다.

두 번째 줄에서 F#의 또 다른 중요한 특성인 패턴 매칭을 볼 수 있다. 패턴 매칭은 match ... with ... 와 같이 표현한다. 함수 fact는 인자가 0 이면 1 을 반환하고, 아니면 두 번째 케이스를 실행하여 0에 도달할 때까지 fact 을 재귀적으로 계속 호출한다. 패턴 매칭에서 underbar('_')는 디폴트 케이스를 의미한다.

계산과정을 살펴보면 위 함수가 어떻게 수행이 되고, [[계승 (수학)|팩토리얼]]이 계산되는지 알 수 있다.
 fact 4
  => 4 * fact 3
  => 4 * (3 * fact 2)
  => 4 * (3 * (2 * fact 1))
  => 4 * (3 * (2 * (1 * fact 0)))
  => 4 * (3 * (2 * (1 * 1)))
  ...
  => 24

F# 은 [[OCaml]]을 계승한 언어여서, 위에서 설명한 부분은 [[OCaml]] 언어에도 그대로 적용된다.

=== 개선된 팩토리얼 함수 ===
팩토리얼 함수는 지수함수 보다도 훨씬 빨리 커지기 때문에 큰 정수의 계산도 가능해야 하고, 재귀호출 함수의 성능도 고려해야 한다. 큰 정수의 곱셈 계산을 위해 팩토리얼 값은 bigint 타입을 이용하고 그 대신 factiorial 함수의 인자는 int 타입으로 하여 재작성해 보았다. bigint 타입을 표현하는 리터럴은 int 타입을 표현하는 리터럴의 끝에 문자 I만 붙이면 된다. 즉 4는 int 타입이지만 4I는 bigint 타입이다. 또 int 타입을 bigint 타입으로의 타입변환은 정수값이 되는 표현식의 좌측에 bigint 만 붙이면 된다. 즉, bigint expression1 하면 expression1의 값을 bigint 타입으로 변환하는 식이다. 아래의 소스에서는 함수의 인자(매개변수)로 전달된 int 타입의 값 x를 bigint 타입으로 변환하기 위해 bigint x 라는 타입 변환식을 사용하였다. 아래의 factorial 함수는 (int -> bigint) 타입의 함수이다.
<syntaxhighlight lang='fsharp'>
 #light

 let factorial n = 
     let rec fac a x =
         match x with
         | k when k < 1 -> 1I
         | k when k = 1 -> a
         | v -> fac (a*(bigint x)) (x-1)
     fac 1I n

 let b = 50
 let z = factorial b
 printfn "%O! = %O" b z
</syntaxhighlight>
C 언어, Java 언어에서는 함수 안에서 함수를 또 정의하지 못하지만 F# 언어는 Python 언어, Lua 언어처럼 함수 안에서 함수를 또 정의할 수 있다. 위의 소스는 factorial 함수 안에서 재귀호출 함수 fac 을 정의하는 중첩 구조(nested structure)로 되어 있다.

위의 소스 코드의 실행 결과는
 50! = 30414093201713378043612608166064768844377641568960512000000000000
이다.

저 소스에서 재귀호출 함수 fac에 전달되는 첫번 째 인자 a는 상태로 이해하면 된다. 여기서 상태는 재귀 호출 과정에서 계산된 전 단계의 팩토리얼 값으로 이용되고 있다. 4! 을 계산하는 저 소스의 계산과정을 추적하면
  fac 1I 4
  => fac (4I) 3
  => fac (12I) 2
  => fac (24I) 1
  => 24I
이다.

저 소스는 5000! 을 계산할 때도 stack overflow를 걱정하지 않아도 된다.
이것이 F# 언어의 한 특징이다. 보통의 명령형 언어(Python 언어)와 달리 패턴 매칭(match)에 의한 재귀호출은 상태에 의한 호출이기 때문이다. 저 소스에서 쓰인 재귀호출을 보통은 꼬리재귀호출이라고 한다.

== 같이 보기 ==
* [[피보나치 수 프로그램]]

== 각주 ==
{{각주}}

== 외부 링크 ==
* {{공식 웹사이트|fsharp.org}} F# 소프트웨어 재단
* [http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/default.aspx 마이크로소프트 리서치의 F# 사이트]
** [http://msdn.microsoft.com/library/dd233154(VS.100).aspx F# 매뉴얼]
* [http://www.fsharp.net F Sharp & F# .Net] {{웨이백|url=http://www.fsharp.net/ |date=20081119161341 }}

{{주요 프로그래밍 언어}}
{{닷넷 프레임워크}}

[[분류:닷넷 프로그래밍 언어]]
[[분류:크로스 플랫폼 자유 소프트웨어]]
[[분류:함수형 프로그래밍 언어]]
[[분류:2002년 개발된 프로그래밍 언어]]
[[분류:마이크로소프트 리서치]]
[[분류:ML 프로그래밍 언어 계열]]
[[분류:아파치 라이선스 소프트웨어]]
[[분류:패턴 매칭 프로그래밍 언어]]
[[분류:정적 타입 프로그래밍 언어]]
[[분류:마이크로소프트의 프로그래밍 언어]]