assembly.jc 2018-9-13 21:37
近日有師兄介紹 F#,是一結合 Functional 和 OO 的 language,Syntax 風格是 functional,typed system 又用返 OO。到底會變成什麼? 結果先說,有點怪。
未 coding 之前講講 F#的背景,它是 M$ 記 .Net 平台 其中一種 language,只要安裝 Visual Studio 2010+,就有晒 REPL 和 compiler。網上都有 Online REPL,但好慢。
既然是M$ .Net,第一個賣點就係可以用到 .Net 平身大的 library,Functional language 又語法出左名簡潔,加埋 .Net 二者結合好似好完美咁,但事實又係點呢?
assembly.jc 2018-9-14 01:29
先來個 Hello World! 可以在 online REPL
In functional way:
[code]printfn "Hello F#"[/code]In OO way
[code]open System
Console.WriteLine("Hello F# on .Net")[/code]驟眼看像一些 script language,但不是。
[[i] 本帖最後由 assembly.jc 於 2023-10-22 03:51 編輯 [/i]]
assembly.jc 2018-9-14 02:18
定義一個 Function,可用 let keywork,
[code]let saySomething msg = printfn "%s" msg
let saySomethingOnDotNet msg = Console.WriteLine(msg.ToString())[/code]但以下 statement 定義的是 function 還是 constant/variable 呢?
[code]// Is variable or function??
let message = "F# is functional language"[/code]Call functions
[code]saySomething message
saySomethingOnDotNet message[/code]
[[i] 本帖最後由 assembly.jc 於 2023-10-22 03:52 編輯 [/i]]
assembly.jc 2018-9-14 02:30
如果定義的 function 沒有 parameter,它到底是 function 還是 variable 呢?
好,試一個有 side-effect 的 function[code]let currentTime = DateTime. Now .ToString()[/code]打印目前的時間,中間停 2 秒[code]saySomething currentTime
Thread.Sleep(2000) // sleep 2 seconds
saySomething currentTime[/code]結果,2次打印的時間一樣。即係 DateTime. Now .ToString() 只執行了一次,每次 call currentTime 都會用同一個結果。
好,如果 function 是有 parameter的。情況是...[code]let currentTimeVar () = DateTime. Now .ToString()
saySomething (currentTimeVar())
Thread.Sleep(2000) // sleep 2 seconds
saySomething (currentTimeVar())[/code]每次 call currentTimeVar (),時間都會變,為什麼呢?
這是 F# 其中一個怪異的地方
[[i] 本帖最後由 assembly.jc 於 2018-9-14 02:32 AM 編輯 [/i]]
form5 2018-9-14 22:15
> let x = "hello";;
val x : string = "hello"
> let y = fun(x) -> x*2;;
val y : x:int -> int
> let y x = x * 2;;
val y : x:int -> int
> open System;;
> System.Console.WriteLine(x)
- ;;
hello
val it : unit = ()
> System.Console.WriteLine x ;;
hello
val it : unit = ()
> let now = System.DateTime . DateTime . ToString();;
val now : string = "2018-09-14 22:09:17"
> let now2() = System.DateTime. DateTime . ToString();;
val now2 : unit -> string
> now2
- ;;
val it : (unit -> string) = <fun:it@47-2>
> now2();;
val it : string = "2018-09-14 22:09:52"
> let now3 = fun() -> System.DateTime . DateTime .ToString();;
val now3 : unit -> string
> now3
- ;;
val it : (unit -> string) = <fun:it@55-3>
> now3();;
val it : string = "2018-09-14 22:11:14"
> now3();;
val it : string = "2018-09-14 22:11:17"
> now
- ;;
val it : string = "2018-09-14 22:09:17"
[[i] 本帖最後由 form5 於 2018-9-14 10:19 PM 編輯 [/i]]
fitcat07 2018-9-15 08:49
[quote]原帖由 [i]form5[/i] 於 2018-9-14 10:29 PM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=487333054&ptid=27712905][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]
F# 是C# 的 簡化 版
:lol [/quote]
其實,F#係ML嘅改版,正如J#(重有冇人記得?)係Java嘅改版。
個人幾喜歡ML,主力FP但又可以有state,F#睇落好正
assembly.jc 2018-9-15 13:14
[quote]原帖由 [i]form5[/i] 於 2018-9-14 10:29 PM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=487333054&ptid=27712905][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]
F# 是C# 的 簡化 版
:lol [/quote]
如果從這個角度看,其實還好。
assembly.jc 2018-9-15 13:23
[quote]原帖由 [i]McLoneV[/i] 於 2018-9-14 03:13 AM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=487290667&ptid=27712905][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]
其實現在有什麼人用F#,或F#的使用對象是誰? [/quote]
小弟也不清楚。對象明顯是 .Net 的用家囉。
assembly.jc 2018-9-15 14:26
[quote]原帖由 [i]fitcat07[/i] 於 2018-9-15 08:49 AM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=487347800&ptid=27712905][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]
其實,F#係ML嘅改版,正如J#(重有冇人記得?)係Java嘅改版。
個人幾喜歡ML,主力FP但又可以有state,F#睇落好正 [/quote]
可惜 F# 無 Haskell 的 classtype。
assembly.jc 2018-9-15 15:49
順便簡單列一列好和壞的東西,有錯或遺漏,請各位 ching 指出:
好的:
1. default immutable, no null
2. Curry 比一般的 imperative language python, javascript ...等等都方便自然
3. 有 Arrow operator: compile time 會 check parameter type
e.g. let f:int->int->int = fun a b -> a + b
f 1 2 // fine
f 1.0 2.0 // compile error, require int type, not float
4. Pattern match 代替 if, switch, ...
e.g
let ans = function
| "y" | "yes" -> "Go ahead"
| "n" | "no" -> "stop"
| _ -> "I don't know!"
壞的:
1. 無 typeclass, 無 polymorphic data type
2. pure (no-side effect) 和 impure (side effect) 混合在一起
3. Default Strict, Lazy evaluation 要加 keyword, (不知是好是壞,個人喜好吧)
assembly.jc 2018-10-1 15:44
更新一下,遲些可能會繼續寫