在 Haskell 中的 Variable 因為是 Immutable,所以算是 Definition,由於 Haskell 支援 First Class Function,因此 Variable 也能是 Function。
Version
Haskell for Mac 1.8.2
Function
f x y =
if x - y > 0
then x - y
else 0
f 3 1
f 1 3
以上簡單的 function,我們發現幾個問題:
x - y
不易閱讀,應該取一個有意義的名稱代表其意義x - y
在 function 中重複使用
在 Haskell 中有三種解法:
- Where clause
- Let expression
- Lambda function
Haskell 中 everything is expression,因此
if then else
也是 expression,相當於 ECMAScript 的?:
Where Clause
f x y =
if z > 0
then z
else 0
where z = x - y
f 3 1
f 1 3
使用 where
定義 z
,如此 if
與 then
之後都可使用 z
。
Let Expression
f x y =
let z = x - y
in
if z > 0
then z
else 0
f 3 1
f 1 3
where
是定義在最後面,但也可使用 let
將 variable 在一開始定義,然後在 in
之後補上原本 expression。
Lambda Function
f x y =
(\z -> if z > 0
then z
else 0)(x - y)
f 3 1
f 1 3
也可將 variable 改以 lambda function 的 parameter 定義,將 x - y
以 argument 傳入。
其實這就是 ECMAScript 的 IIFE
Conclusion
- 基於 Haskell 的 everything is expression 哲學,儘管使用了
where
或let
,仍不改其 expression 本色 let
是定義在前,而where
是定義在後- Lambda function 搭配 IIFE 亦可取代
where
與let
,亦不失其 expression 特質