Share to: share facebook share twitter share wa share telegram print page

 

F 샤프

F#
패러다임다중 패러다임 (함수형, 명령형, 객체 지향, 제네릭, 메타, 병행)
설계자마이크로소프트, F 샤프 소프트웨어 재단
발표일2005년, 버전 1.0
최근 버전9.0[1] 위키데이터에서 편집하기
최근 버전 출시일2024년 11월 12일 (2개월 전)
미리보기 버전5.0 프리뷰
미리보기 버전 출시일2019년 4월 2일(5년 전)(2019-04-02)[2]
자료형 체계정적
웹사이트fsharp.org
영향을 받은 언어
ML, OCaml, C#, 파이썬, 하스켈, 스칼라

F#(에프 샤프)는 강타입 함수형 우선 다중패러다임 언어이다. 주로 공통 언어 기반 크로스 플랫폼으로 사용되며, 자바스크립트[3]나 GPU 코드[4] 생성에도 사용할 수 있다.

F# 소프트웨어 재단[5]이나 마이크로소프트, 오픈소스 기여자에 의해 개발된다. F# 소프트웨어 재단에서 만든 오픈소스 크로스 플랫폼 컴파일러가 있다.[6] 비주얼 스튜디오[7]자마린 스튜디오[8]에서도 지원한다. 다른 프로그램으로는 Mono, MonoDevelop, SharpDevelop, MBrace, WebShaper 등이 있다. 테스트 에디터에서도 플러그인 형식으로 지원하며, 특히 Atom, VSCode, Vim, Emacs, Rider 등에서 지원한다.

F#은 ML 계열의 언어이며, 닷넷 프레임워크OCaml 구현체로 시작했고,[9][10] C#, 파이썬, 하스켈, 스칼라, 얼랭에서 영향을 받았다.

문법

F# 함수의 형태

함수형 프로그래밍의 "Hello World"라고 할 만한 것은 팩토리얼을 계산하는 코드이다. F# 으로는 다음과 같이 표현할 수 있다.

let rec fact n =
    match n with
    | 0 -> 1
    | _ -> n * fact (n-1);;

이 코드는 팩토리얼을 재귀 함수로 정의한 것이다. 일반적으로 함수를 정의할 때는 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) 타입의 함수이다.

 #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

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)에 의한 재귀호출은 상태에 의한 호출이기 때문이다. 저 소스에서 쓰인 재귀호출을 보통은 꼬리재귀호출이라고 한다.

같이 보기

각주

  1. https://github.com/dotnet/fsharp/releases/tag/v12.9.100-beta.24522.2.
  2. https://www.infoq.com/news/2019/04/FSharp-Nulls
  3. Bouras, Christos; Papazois, Andreas; Stasinos, Nikolaos (2014년 8월). “A Framework for Cross-Platform Mobile Web Applications Using HTML5”. IEEE. doi:10.1109/ficloud.2014.75. ISBN 978-1-4799-4357-9. 
  4. Gobron, Stephane; Mestre, Daniel (2007년 7월). “Information Visualization of Multi-dimensional Cellular Automata using GPU Programming”. IEEE. doi:10.1109/iv.2007.69. ISBN 0-7695-2900-3. 
  5. González-Barahona, Jesús M.; Robles, Gregorio (2011년 10월 18일). “On the reproducibility of empirical software engineering studies based on data retrieved from development repositories”. 《Empirical Software Engineering》 17 (1-2): 75–89. doi:10.1007/s10664-011-9181-9. ISSN 1382-3256. 
  6. “GitHub und Open Source Software”. 《Computer und Recht》 35 (6): r69–r69. 2019년 6월 1일. doi:10.9785/cr-2019-350626. ISSN 2194-4172. 
  7. “functional programming language”. Berlin/Heidelberg: Springer-Verlag. 
  8. 《European Commission on Slow Growth and New Investment Plans: August 28 and November 26, 2014》. 2300 N Street, NW,  Suite 800,  Washington  DC  20037  United States: CQ Press. 418–427쪽. ISBN 978-1-4833-8052-0. 
  9. 《Acknowledgements》. Elsevier. 2012. 11쪽. ISBN 978-0-12-387737-6. 
  10. Syme, Don (2006). “Leveraging .NET meta-programming components from F#”. New York, New York, USA: ACM Press. doi:10.1145/1159876.1159884. ISBN 1-59593-483-9. 

외부 링크

Kembali kehalaman sebelumnya


Index: pl ar de en es fr it arz nl ja pt ceb sv uk vi war zh ru af ast az bg zh-min-nan bn be ca cs cy da et el eo eu fa gl ko hi hr id he ka la lv lt hu mk ms min no nn ce uz kk ro simple sk sl sr sh fi ta tt th tg azb tr ur zh-yue hy my ace als am an hyw ban bjn map-bms ba be-tarask bcl bpy bar bs br cv nv eml hif fo fy ga gd gu hak ha hsb io ig ilo ia ie os is jv kn ht ku ckb ky mrj lb lij li lmo mai mg ml zh-classical mr xmf mzn cdo mn nap new ne frr oc mhr or as pa pnb ps pms nds crh qu sa sah sco sq scn si sd szl su sw tl shn te bug vec vo wa wuu yi yo diq bat-smg zu lad kbd ang smn ab roa-rup frp arc gn av ay bh bi bo bxr cbk-zam co za dag ary se pdc dv dsb myv ext fur gv gag inh ki glk gan guw xal haw rw kbp pam csb kw km kv koi kg gom ks gcr lo lbe ltg lez nia ln jbo lg mt mi tw mwl mdf mnw nqo fj nah na nds-nl nrm nov om pi pag pap pfl pcd krc kaa ksh rm rue sm sat sc trv stq nso sn cu so srn kab roa-tara tet tpi to chr tum tk tyv udm ug vep fiu-vro vls wo xh zea ty ak bm ch ny ee ff got iu ik kl mad cr pih ami pwn pnt dz rmy rn sg st tn ss ti din chy ts kcg ve 
Prefix: a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9