let運算式可用來建立區域作用域,在幾種情況下很方便:
在let運算式裡幾乎什麼都能做,包括解構(這部分會在之後的練習中詳細說明),但無法在裡面定義新的自訂型別或型別別名。
let
cube x = x * x * x
in
cube a + cube b + cube c
beginWithPattern : Size -> Padding -> Pattern -> GameOfLife
beginWithPattern minimumSize padding pattern =
let
size = calculateSize minimumSize padding pattern
center = Size.center size
centeredPattern = Pattern.centerAt center pattern
dimensions = { width = size, height = size }
deadCells = Matrix.create dimensions Dead
in
GameOfLife (bringPatternToLife deadCells centeredPattern)
你生日時收到一本新的食譜書,你想知道裡頭的千層麵食譜是不是比你目前最愛的那本還棒。在這個練習裡,你會寫一些程式碼,幫你照著這本新食譜書做出千層麵。
你的室友還在辦公室忙,她想知道千層麵什麼時候會好,這樣她才能確定自己趕得回來。
建立一個函式來算出千層麵什麼時候會好。為了讓程式碼簡潔又有表達力,你應該使用let運算式。
定義remainingTimeInMinutes函式,它接受兩個參數,並以一個let運算式作為本體。第一個參數是千層麵的層數,第二個參數是你開始烹飪後經過的分鐘數。
定義expectedMinutesInOven(在let運算式的let部分),用來確認千層麵應該在烤箱裡烤幾分鐘。根據食譜書,預期的烤箱時間是 40 分鐘:
expectedMinutesInOven
--> 40
定義preparationTimeInMinutes(在let運算式的let部分),它接受千層麵的層數作為參數,並回傳準備千層麵需要幾分鐘,假設每一層需要 2 分鐘準備。
preparationTimeInMinutes 3
--> 6
回傳千層麵完成前還剩幾分鐘(在let運算式的in部分),也就是preparationTimeInMinutes和expectedMinutesInOven的總和,再減掉你開始烹飪後經過的分鐘數。
remainingTimeInMinutes 3 10
--> 6 + 40 - 10 = 36