F# 之 Unit 與 Ignore 簡介

栏目: ASP.NET · 发布时间: 7年前

内容简介: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 值。

F# 之 Unit 與 Ignore 簡介

若觀察 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

F# 之 Unit 與 Ignore 簡介

Type Inference 推導為 unit ,是 unit 型別的 value,而不是 function。

let print () = printfn "%s" "Hello World"

正確寫法應該使用 () 代表其無 input 值,但其 定義域() ,也就是 unit type。

F# 之 Unit 與 Ignore 簡介

Type Inference 推導的 printunit -> unit ,是 unit -> unit 型別的 function,而不是 value。

let print () = printfn "%s" "Hello World"

print ()

呼叫 prinf() 時,也要明確傳入 () 代表 no input。

F# 之 Unit 與 Ignore 簡介

有 return 但不想用

let sum x y  = x + y

sum 2 3

明明 sum() 有 return x + y ,但呼叫 sum() 時卻沒處理 return 值,compiler 編譯後會抱怨。

F# 之 Unit 與 Ignore 簡介

有兩種解法:

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

Microsoft Docs , Unit Type

Jose Gonzales , What’s the Unit Type in F#?

Stack overflow , What does this () notation mean?

Chris Smith , Pramming F# 3.0 2nd


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

失控的真相

失控的真相

[美] 迈克尔·帕特里克·林奇 / 赵亚男 / 中信出版社 / 2017-6 / 42.00元

编辑推荐 在信息泛滥的时代,知识变得无处不在。鼠标轻轻一点,我们就坐拥一座巨型图书馆。然而,我们并没有因此就离真相更近。相反,互联网的普及使人们早已习惯于凡事问搜索引擎,并形成了一种“搜索即相信”的认知模式。当社交网络把数字人类带入一个个彼此隔绝的线上群体中,我们清楚地看到,真相与谎言在互联网中交织,知识与观念混为一谈,情绪宣泄掩盖了事实分析。联网的世界让我们更容易看到彼此的观点,但同时也制......一起来看看 《失控的真相》 这本书的介绍吧!

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具