F 샤프

위키百科, 우리 모두의 百科事典.

F#
패러다임 多重 패러다임 ( 函數兄 , 命令形 , 客體 志向 , 제네릭 , 메타 , 病行 )
設計者 마이크로소프트 , F 샤프 소프트웨어 財團
發表日 2005年, 버전 1.0
最近 버전 16.8 [1]   위키데이터에서 편집하기
最近 버전 出市日 2020年 11月 10日 (3年 前)
미리보기 버전 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. “Release 16.8” . 2020年 11月 10日 . 2023年 3月 19日에 確認함 .  
  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. Gonzalez-Barahona, Jesus 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 .  

外部 링크 [ 編輯 ]