ElmのMaybeとResultとTask(1)Maybe
Elmにはnullが無い!ぬるぽが無い!
Javascriptでよく出てくるエラーである、 “undefined is not a function"が無いということは、「値がないかもしれないことを"Maybe"というデータ構造を用いてあらかじめはっきりさせておくことだそうです。(この言い回し、変かもしれません。)
最近、以下の記事を読んで『なるほどー!』と感動しました。
https://qiita.com/Yametaro/items/7988b7dd2728cc2b9456
以下の本を写経しながら、ちょっと、Maybe, Result, Taskについて遊んでみたいと思います。
いつか、Task.andThen まで自分で使えるようになりたい。。。
開発環境
Windows 10 Pro
Chrome
VisualStudioCode 1.32.3
git version 2.20.1.windows.1
nvm 1.1.7
node 10.2.0
npm 6.4.1
elm 0.19.0-bugfix6
elm-format 0.8.1
VisualStudioCodeの拡張機能でelmをインストールして、settings.jsonに以下のようにelmを設定。
(『Alt + Shift + F』と『Ctrl + S』を使用。)
"[elm]": {
"editor.formatOnSave": true
},
Maybe
とりあえず、Maybeについては、『わざわざ学んでみたらElmのMaybe型が楽しかった』の記事を読むのが一番しっくりきました。お勧めです。
個人的に、Elmについて何か調べるときは、以下の3つを見てから、QiitaとGoogleで検索といった感じでしょうか。
- 基礎からわかる Elmの該当ページ(Maybeの場合はp84)
- Elm公式ガイドの日本語訳(Maybeの場合はこちら)
- Elm公式packageドキュメント(Core PackageのMaybe)
上記にもありますが、Maybeは、『カスタム型』で以下のように定義されるそうです。
type Maybe a
= Just a
| Nothing
基礎からわかる Elmの p84 によると、
Maybe a型の値は
a型の値が存在することを示す Just a
a型の値が存在しないことを示す Nothing
のどちらかということになります。
Maybeは『部分関数』と『入力が任意のフィールド』の2つの場合に役立つ
と、 こちら に説明されています。
『部分関数』の例として、String.toFloat 関数(文字列を数に変換する関数)
『入力が任意のフィールド』の例として、User のname(入力必須)とage(入力任意)があった場合、20歳以上にお酒を売るような場合
だそうです。写経してみます。
部分関数
String.toFloat 関数
elm repl でこちらを写経してみます。
String.toFloat
String.toFloat "3.1415"
String.toFloat "abc"
List.head 関数
List.head関数は、リスト(配列のようなもの)の先頭要素を取得します。ただし、リストの要素がない場合は、Nothingを返します。
List.head
List.head [1, 2, 3]
List.head []
次のように、リストの値により場合分けした処理を記載することがあります。
C:/elm/ フォルダをVisualStudioCodeで開き、Ctrl+@でターミナル画面を開き、以下を入力。(何か聞かれたらEnter。)
elm init
src/Main.elm を新規作成し、以下を入力。
module Main exposing (showFirstValue)
showFirstValue : List Int -> String
showFirstValue list =
case List.head list of
Just value ->
String.fromInt value
Nothing ->
"Empty!"
この状態で、再度、VisualStudioCodeのターミナル画面で、以下のように入力します。
elm repl
import Main exposing (showFirstValue)
showFirstValue [2, 3, 4, 5]
showFirstValue []
入力が任意のフィールド
こちらのコードを写経してみます。ユーザのモデルを考えます。ユーザのnameは入力必須とし、ageは入力任意とします。
Sueはnameのみを入力し、
Tomはnameとageを入力したとします。
src/Main.elmに以下のように記載します。
ここで、20歳以上とわかるuserのみにお酒を販売できるかどうかを判定する関数canBuyAlcohol 関数
を定義するためには、以下のように記載します。
src/Main.elmの一番上の行を、以下のように変更します。
module Main exposing (showFirstValue, canBuyAlcohol, tom, sue)
以下のようにターミナル画面に入力します。
elm repl
import Main exposing (..)
canBuyAlcohol tom
canBuyAlcohol sue
Maybeを使用するときには、24 ではなく、
Just 24
のように記載しなければいけないのは、ちょっと面倒に感じました。
Maybeモジュールの主な関数
基礎からわかる Elmの p85に記載されている
- Maybe.withDefault 関数
- Maybe.map 関数
- Maybe.andThen 関数
も触ってみたかったのですが、力尽きたのでまたの機会に。
とりあえず、map関数とandThen関数は、
- Maybeモジュールのもの
- Taskモジュールのもの
など、いろいろなモジュールにある関数だということはわかりました。ややこしい。。。
途中
ディスカッション
コメント一覧
まだ、コメントがありません