學習軌道
/
Elm
Elm
/
練習
/
Mario 的絕妙千層麵
Mario 的絕妙千層麵

Mario 的絕妙千層麵

學習練習

簡介

Let

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)

說明

你生日時收到一本新的食譜書,你想知道裡頭的千層麵食譜是不是比你目前最愛的那本還棒。在這個練習裡,你會寫一些程式碼,幫你照著這本新食譜書做出千層麵。

你的室友還在辦公室忙,她想知道千層麵什麼時候會好,這樣她才能確定自己趕得回來。

1. 算出千層麵什麼時候會好

建立一個函式來算出千層麵什麼時候會好。為了讓程式碼簡潔又有表達力,你應該使用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
透過 GitHub 編輯 連結會在新視窗或分頁中開啟
Elm Exercism

準備好開始 Mario 的絕妙千層麵 了嗎?

註冊 Exercism,透過 28 個概念110 個練習 和真人引導來學習並精通 Elm,全部免費。