内容简介:F# 是 FP,強調 function 都要有 input 值,也要有 return 值,若 function 真的沒有 input 值,也沒有 return 值,在 F# 該如何表示呢?FP 的思考來自於數學函數,認為 function 都要有但在電腦語言的 function,可能沒有 input 值,也可能沒有 return 值,這就與數學 function 不同,針對這種需求,F# 特別設計出新的型別
F# 是 FP,強調 function 都要有 input 值,也要有 return 值,若 function 真的沒有 input 值,也沒有 return 值,在 F# 該如何表示呢?
Unit 與 ()
FP 的思考來自於數學函數,認為 function 都要有 定義域
與 對應域
,如 y = f(x)
,也就是 input x
的型別就是 定義域
,而 return y
的型別就是 對應域
。
但在電腦語言的 function,可能沒有 input 值,也可能沒有 return 值,這就與數學 function 不同,針對這種需求,F# 特別設計出新的型別 unit
,其值只有一個 ()
。
無 return
let print msg = printfn "%s" msg print "Hello World"
print()
為 function,其內容只有 printfn()
印出 msg
,這就是典型 I/O 類的 side effect,但沒有 return 值。
若觀察 print()
的型別,其為 string -> unit
,也就是若沒 return 值,Type Inference 會推導為 unit
。
Q : 所以 unit
不就 C# 的 void
?
若以無 return 值的 function 觀點, unit
相當於 void
沒錯,但 unit
還有其他用途。
無 input
若想要建立 input()
,但不用傳入任何值,就可以印出 Hello World
。
直覺會這樣寫:
let print = printfn "%s" "Hello World"
但別忘了 F# 強調是 Function Value,也就是 function 也視為是一種 value,因此都使用 let
。
Type Inference 推導為 unit
,是 unit
型別的 value,而不是 function。
let print () = printfn "%s" "Hello World"
正確寫法應該使用 ()
代表其無 input 值,但其 定義域
為 ()
,也就是 unit
type。
Type Inference 推導的 print
為 unit -> unit
,是 unit -> unit
型別的 function,而不是 value。
let print () = printfn "%s" "Hello World" print ()
呼叫 prinf()
時,也要明確傳入 ()
代表 no input。
有 return 但不想用
let sum x y = x + y sum 2 3
明明 sum()
有 return x + y
,但呼叫 sum()
時卻沒處理 return 值,compiler 編譯後會抱怨。
有兩種解法:
let sum x y = x + y let result = sum 2 3
明確將 sum()
結果 binding 到 result
value,這是 FP 最標準做法。
let sum x y = x + y sum 2 3 |> ignore
將 sum()
結果 pipeline 到 ignore()
,則 compiler 就不會抱怨。
實務上若真的不想處理 function 的結果,建議使用 ignore()
Conclusion
- FP 嚴格遵守數學 function 定義,但電腦 function 卻可能沒有 input 也沒有 return,因此 F# 特別設計出
unit
與()
,這樣就與數學的定義域
與對應域
的觀念相通
Reference
Jose Gonzales , What’s the Unit Type in F#?
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Big C++中文版
霍斯特曼 / 姚爱红 / 电子工业 / 2007-3 / 85.00元
本书是一本关于C++的优秀教材,南圣何塞州立大学知名教授Horstmann编写。全书深入探讨了C++的知识,并着重强调了安全的标准模板库;本书较厚,但它可用做程序设计专业学生的教材(两学期)。全书在介绍基础知识后,作者论及了一些高级主题。书中面向对象的设计一章探讨了软件开发生命周期问题,给出了实现类关联的实用提示。其他高级主题包括模板,C++标准模板库,设计模式,GUI,关系数据库以及XML等。本......一起来看看 《Big C++中文版》 这本书的介绍吧!