이 文書는 위키百科의
技術的인 限界
로 인하여 다른 題目을 使用합니다. 이 文書의 正確한 題目은
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)에 依한 再歸呼出은 狀態에 依한 呼出이기 때문이다. 저 소스에서 쓰인 再歸呼出을 普通은 꼬리再歸呼出이라고 한다.
같이 보기
[
編輯
]
各州
[
編輯
]
- ↑
“Release 16.8”
. 2020年 11月 10日
. 2023年 3月 19日에 確認함
.
- ↑
https://www.infoq.com/news/2019/04/FSharp-Nulls
- ↑
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
.
- ↑
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
.
- ↑
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
.
- ↑
“GitHub und Open Source Software”
. 《Computer und Recht》
35
(6): r69?r69. 2019年 6月 1日.
doi
:
10.9785/cr-2019-350626
.
ISSN
2194-4172
.
- ↑
“functional programming language”
. Berlin/Heidelberg: Springer-Verlag.
- ↑
《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
.
- ↑
《Acknowledgements》
. Elsevier. 2012. 11쪽.
ISBN
978-0-12-387737-6
.
- ↑
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
.
外部 링크
[
編輯
]