點燈坊

失くすものさえない今が強くなるチャンスよ

Haskell 之 Variable

Sam Xiao's Avatar 2020-02-02

在 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 的 ?:

variable000

Where Clause

f x y = 
  if z > 0 
  then z 
  else 0 
  where z = x - y

f 3 1
f 1 3  

使用 where 定義 z,如此 ifthen 之後都可使用 z

variable001

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。

variable002

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

variable003

Conclusion

  • 基於 Haskell 的 everything is expression 哲學,儘管使用了 wherelet,仍不改其 expression 本色
  • let 是定義在前,而 where 是定義在後
  • Lambda function 搭配 IIFE 亦可取代 wherelet,亦不失其 expression 特質