スポンサーリンク

ElmのMaybeとResultとTask(1)Maybe

2019年6月22日

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で検索といった感じでしょうか。

上記にもありますが、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モジュールのもの

など、いろいろなモジュールにある関数だということはわかりました。ややこしい。。。

途中

スポンサーリンク

ElmElm,Task

Posted by twosquirrel