Gleamの定数は、値に名前を付けるための仕組みです。constキーワードを使って定義します。
pub const pi: Float = 3.14159
pub fn circle_area(radius: Float) -> Float {
radius *. radius *. pi
}
pubキーワードを付けて定義したモジュール定数は、他のモジュールからも参照できます。付けなかった場合は、定義したモジュールの中からしか参照できません。
OrderGleamの標準ライブラリにあるgleam/orderモジュールには、値を比較するためのOrder型が含まれています。
Orderの定義は、次のようになっています。
pub type Order {
Gt
Eq
Lt
}
この型には3つのバリアントがあり、それぞれが値と別の値との関係を表すために使われます。
Gt - 値がもう一方の値より_大きい_ことを表します。Eq - 値がもう一方の値と_等しい_ことを表します。Lt - 値がもう一方の値より_小さい_ことを表します。データ型を大きさで比較できる場合、そのモジュールがOrder値を返すcompare関数を定義するのが一般的です。たとえば、gleam/floatとgleam/intは、それぞれ小数と整数を扱うcompare関数を定義しています。
int.compare(1, 2)
// -> Lt
int.compare(2, 2)
// -> Eq
float.compare(1.0, 2.0)
// -> Lt
list.sortのような並べ替え関数は、Order値を返す関数を引数に取るのが一般的で、呼び出し側がリストをどのように並べ替えるかを決められます。
list.sort([3, 7, 3, 1], by: int.compare)
// -> [1, 3, 3, 7]
Toriは気候ジャーナリストで、さまざまな都市の天気についての記事を書こうとしています。Toriはいろいろな都市の天気のデータを持っていて、気温をもとにそれらの都市を順位づけしたいと考えています。ただ、気温の単位が華氏のものと摂氏のものに分かれています。そこで、気温を同じ単位に変換して順位づけるために、助けが必要です。
fahrenheit_to_celsius関数を定義してください。この関数は、華氏の気温を入力として受け取り、摂氏の気温を返します。
華氏を摂氏に変換するには、華氏の値から32を引いて、その結果を1.8で割ります。
fahrenheit_to_celsius(72.5)
// -> 22.5
compare_temperature関数を定義してください。この関数は2つの気温を受け取り、1つ目の気温が2つ目の気温より小さいか、等しいか、大きいかを示すOrderの値を返します。
compare_temperature(Celsius(30.5), Fahrenheit(82.1))
// -> Gt
sort_cities_by_temperature関数を定義してください。この関数は都市の配列を受け取り、最も寒い都市から最も暖かい都市の順に並べて返します。
sort_cities_by_temperature([
City(name: "London", temperature: Celsius(30.5)),
City(name: "Paris", temperature: Fahrenheit(82.1))
])
// -> [
// City(name: "Paris", temperature: Fahrenheit(82.1)),
// City(name: "London", temperature: Celsius(30.5)))
// ]