查看完整版本 : 初學 F#

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]]

McLoneV 2018-9-14 03:13

其實現在有什麼人用F#,或F#的使用對象是誰?

煙民母親生賤種

*** 作者被禁止或刪除 內容自動屏蔽 ***

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]]

form5 2018-9-14 22:29

F# 是C# 的 簡化 版
:lol

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

更新一下,遲些可能會繼續寫
頁: [1]
查看完整版本: 初學 F#