トラック
/
Haskell
Haskell
/
演習
/
ルシアンの絶品ラザニア
ルシアンの絶品ラザニア

ルシアンの絶品ラザニア

学習演習

はじめに

定数と関数

Haskellのプログラムは、定義と式からできています。

定数の値は、name = expressionで定義します。

five = 5

six = 3 + 3

関数は、name parameters... = expressionで定義します。仮引数は、スペースだけで区切ります。

add number1 number2 = number1 + number2

関数の呼び出しもまた式であり、関数名を指定して、その関数の仮引数それぞれに実引数をスペースで区切って渡すことで行います。書き方は関数の定義と同じです。

five = add 2 3

括弧(())を使うと、式を評価する順序を指定できます。

six = add 2 (1 * 4)

twelve = add 2 1 * 4

インデントと意味を持つ空白文字

Haskellでは、空白文字とインデントを使ってコードの境界を指定します。 ある式の一部であるコードは、その式の先頭よりも深くインデントする必要があります。

  • モジュール、インポート、トップレベルの関数定義は、いちばん左の列から始めなければなりません。
  • 式を複数の行に分ける場合、その式の一部であるコードは、その式の下に少なくとも1つのスペースでインデントしなければなりません。
  • ひとまとまりになっている式の部分は、同じ数のスペースでインデントします。
-- A function split over multiple lines, so subsequent lines must be indented
add number1 number2 =
    number1 + number2

https://en.wikibooks.org/wiki/Haskell/Indentation

モジュール

モジュールは関数をエクスポートします。 つまり、モジュールがエクスポート文で公開している関数を使うことができます。 モジュールは、内部でだけ使う関数を定義することもできます。 デフォルトでは、明示的にエクスポートされていない関数は、モジュールの外部から使うことができません。

モジュールの先頭で、モジュール名を指定します。 Calculator.hsというファイルがあるなら、モジュールの名前もCalculatorにします。 そして、エクスポートする関数を指定し、そのあとで関数を書き始めます。 まずは、次のように書き始めます。

module Calculator ( add ) where

https://learnyouahaskell.github.io/modules#making-our-own-modules

コメント

コメントとは、Haskellのファイルの中にあるテキストのうち、コードとして解釈されないものです。 主に、書いた本人やほかのプログラマーが読むためのものです。 1行コメント用の軽量な書き方があり、2つのダッシュを使います。 複数行コメントも可能で、{-と-}の開き・閉じの区切り文字のペアを使います。

-- a single line comment
-- another single line comment

{- a multiline comment
   spanning multiple lines
-}

クレジット

この演習の紹介文は、Learn You a Haskell for Great Good!から自由に借用しており、Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported Licenseに基づいています。

説明

この演習では、お気に入りの料理本を見ながら最高のラザニアを作れるように、コードを書いていきます。

タスクは3つあり、どれもラザニアの調理にかかる時間に関するものです。

1. オーブンでの想定時間を分単位で定義する

expectedMinutesInOven定数を定義して、ラザニアをオーブンに入れておくべき時間が何分かを確認しましょう。料理本によると、オーブンでの想定時間は40分です。

expectedMinutesInOven
    --> 40

2. 準備にかかる時間を分単位で計算する

preparationTimeInMinutes関数を定義しましょう。この関数は、ラザニアに重ねた層の数を仮引数として受け取り、ラザニアの準備に何分かかったかを返します。1層あたり2分かかるものとします。

preparationTimeInMinutes 3
    --> 6

3. 経過時間を分単位で計算する

elapsedTimeInMinutes関数を定義しましょう。この関数は2つの仮引数を取ります。1つ目はラザニアに重ねた層の数、2つ目はラザニアがオーブンに入っている時間(分)です。この関数は、ラザニアの調理に何分かかったかを返します。これは、準備にかかった時間(分)と、その時点でラザニアがオーブンにいた時間(分)を足したものです。

elapsedTimeInMinutes 3 20
    --> 26
GitHubで編集する リンクは新しいウィンドウまたはタブで開きます
Haskell Exercism

ルシアンの絶品ラザニアを始める準備はできましたか?

Exercismに登録すれば、107個の演習、そして本物の人間によるメンタリングとともに、Haskellを学んでマスターできます。すべて無料です。