内容简介:在 Haskell 中的 variable 因為是 Immutable,所以算是 definition,負責程式碼中重複的部分;且有別於一般程式語言的是,由於 Haskell 將 function 也視為 data,因此 variable 也能是 function。若使用 IIFE,則有另外一種使用 Lambda 方式。GHC 8.4.3
在 Haskell 中的 variable 因為是 Immutable,所以算是 definition,負責程式碼中重複的部分;且有別於一般程式語言的是,由於 Haskell 將 function 也視為 data,因此 variable 也能是 function。
若使用 IIFE,則有另外一種使用 Lambda 方式。
Version
GHC 8.4.3
Haskell
Function
calChange given owed = if given - owed > 0 then given - owed else 0
以上簡單的 function,我們發現幾個問題:
given - owed given - owed
在 Haskell 中有三種解法:
- where
- let
- lambda
Where
calChange given owed = if change > 0 then change else 0 where change = given - owed
使用 where
定義 change
,如此 if
與 then
之後都可使用 change
variable。
Let
calChange given owed = let change = given - owed in if change > 0 then change else 0
where
是定義在最後面,但也可使用 let
將 variable 定義在一開始,然後加上 in
。
Lambda
calChange given owed = (\change -> if change > 0 then change else 0) (given - owed)
將非共用的部分抽成 Lambda,再將 given - owed
共用的部分以 parameter 傳入 Lambda。
其實這就是 ECMAScript 的 IIFE。
FSharp
Function
let calChange given owed = if given - owed > 0 then given - owed else 0
使用 let
定義 function,F# 與 Haskell 風格相當接近。
Let
let calChange given owed = let change = given - owed if change > 0 then change else 0
使用 let
定義 change
variable。
Lambda
let calChange given owed = (fun change -> if change > 0 then change else 0) (given - owed)
F# 的 Lambda 使用 fun
,因為 F# 也支援 IIFE,因此寫法與 Haskell 很類似。
ECMAScript
Function
const calChange = (given, owed) => { if (given - owed > 0) return given - owed else return 0 };
最基本的寫法,使用 Arrow Function 定義 calChange()
。
const calChange = (given, owed) => given - owed > 0 ? given - owed : 0;
由於 ECMAScript 支援 ?:
寫法,可以稍微化簡。
Const
const calChange = (given, owed) => { const change = given - owed; return change > 0 ? change : 0; };
類似 Haskell 的 let
寫法,先定義 change
variable。
Arrow Function
const calChange = (given, owed) => (change => change > 0 ? change : 0)(given - owed);
如同 Haskell 的 Lambda 一樣,將非共用部分以 Arrow Function 表示,將共用的 given - owed
以 parameter 傳入。
這就是 IIFE,因為 ECMAScript 與 Haskell 都有 IIFE,所以能使用 Lambda 或 Arrow Function 抽出非共用部分。
CSharp
Function
Func<int, int, int> CalChange = (given, owed) => { if (given - owed > 0) return given - owed; else return 0; };
使用 Func
定義 function,其餘寫法一樣。
Func<int, int, int> CalChange = (given, owed) => given - owed > 0 ? given - owed : 0;
由於 C# 支援 ?:
寫法,可以稍微化簡。
Var
Func<int, int, int> CalChange = (given, owed) => { var change = given - owed; return change > 0 ? change : 0; };
類似 Haskell 的 let
寫法,先定義 change
variable。
Func<int, int, int> CalChange = (given, owed) => { Func<int, int> Body = change => change > 0 ? change : 0; return Body(given - owed); };
因為 C# 沒有 IIFE,因此只能先定義好 Body
function,然後將 given - owed
傳入。
Conclusion
- 傳統都會將共用部分抽成 Lambda 或 Arrow Function,但配合 IIFE,也看到另外一種用法,將非共用部分以 Lambda 表示,將共用部分以 parameter 傳入
- C# 因為沒有 IIFE,所以使用 Lambda 的效果較不顯著
Reference
Will Kurt, Get Programming with Haskell
以上所述就是小编给大家介绍的《Haskell 之 Variable》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Introduction to Programming in Java
Robert Sedgewick、Kevin Wayne / Addison-Wesley / 2007-7-27 / USD 89.00
By emphasizing the application of computer programming not only in success stories in the software industry but also in familiar scenarios in physical and biological science, engineering, and appli......一起来看看 《Introduction to Programming in Java》 这本书的介绍吧!