ガバガバだった
教えてもらいました
やりたかったことhttps://t.co/v5HQfbFkI2
— ABAB↑↓BA (@ababupdownba) 2020年8月21日
こんな感じでどうでしょうか?
ちなみに、Intをパターンマッチしてしまうと(人間としては)無限のパターンを列挙しなければならない & ワイルドカードでそれを握りつぶしてしまうとvoid型人間になってしまいます
ellie-app.com
もうABAB↑↓BAさんに足向けて寝られないです
本当にありがとうございます
改めてやりたかったこと
Int
だと広すぎる(-2147483647~2147483647)
Basics - core 1.0.52, -1, 1, 2
のみを許容する型にしたい
この辺り勘違いしていて、-2~2
を型として持とうとしていた
読み解く
type NumInCounter
type NumInCounter = One | Two
1
と2
のみを許容する型
マイナスは持たず数値だけを持つ
→足すか引くかはIncrement/Decrement
の責務であって型が持つべきではない
だと思う(自信なし)
type Msg
- = IncrementN Int + = Increment NumInCounter + | Decrement NumInCounter
N加算(減算)するのではなく
Increment/Decrement(加算/減算)
で分けている
引数の型がInt
から定義したNumInCounter(One, Two)
に変更
これで加算/減算出来る数値の範囲がOne, Two
のみなっている
numIncCounterToInt関数
numInCounterToInt : NumInCounter -> Int numInCounterToInt num = case num of One -> 1 Two -> 2
定義した型NumInCounter
をInt
に変換する関数
updateのIncrement/Decrement
処理には数値が必要なので、ここで変換している
パターンマッチでOne, Two
のVariant
を網羅していて、
適当にThreeとか追加するとコンパイラが怒ってくれる(えらい)
Int
だと濃度∞だけど
NumInCounter
を定義してnumIncCounterToInt
で
パターンマッチを行っているので濃度2
update関数のパターンマッチ
- IncrementN n -> - { model | count = model.count + n } + Increment num -> + { model | count = model.count + numInCounterToInt num } + Decrement num -> + { model | count = model.count - numInCounterToInt num }
nのチェックについてはnumInCounterToInt
がやってくれているので安心
updateではIncrement/Decrement
の加算減算を処理している
viewの変更
+ [ button [ onClick <| Increment One ] [ text "+1" ] + , button [ onClick <| Increment Two ] [ text "+2" ] + , button [ onClick <| Decrement One ] [ text "-1" ] + , button [ onClick <| Decrement Two ] [ text "-2" ]
これほんとすごくて
- One,Two(1,2)
以外受け入れない様になっている
- 1 2
ではなくOne, Two
なのでVariant
の命名次第では意味を持たせられる
counterサンプルだと微妙だけど、マジックナンバーがなくなる
ということがこれだけで実現できている
viewは加算 or 減算, 1 or 2を渡すだけになっている
分離がハッキリできている
まとめ
- 関数に分離するという脳みそがなかった
- 加算減算は型に持つべきじゃなくて、そこはupdate側の責務
- あくまで型は入るべき値を定義するだけ
テクニック教えてもらって、凄いなー他にも色々あるのかなって思ったら
elmのおもしろいところって今回のテクニックとして新しく覚えたようで update関数がMsgのパターンマッチする と numのパターンマッチの関数を書くってやってること変わらない点なんですよね
— ABAB↑↓BA (@ababupdownba) 2020年8月21日
基本パターンの組み合わせレベルで高度なことできるので、新しく覚えることはもう無いと言っても過言では
そう言われると確かに関数化してパターンマッチして組み合わせてるだけだった
基礎を覚えると応用がかなり効くElm
すごい
久々に言語自体が面白くてワクワクしてている
次回
基礎的な構文を覚えたのでHtml
を色々出力してみる予定です
もうコツ掴んだし余裕っしょw