【悲報】ランダムに1から6のサイコロ出目を表示するコードを書けないことが判明
最新の研究により、僕が任意のプログラミング言語を用いてごく簡単な処理を行うソースコードが書けないということが分かりました。その結果、僕が絶望的にプログラミングに向いていないということが証明されてしまいました。なお現在、「今後は刺身の上にタンポポをのせる仕事を探しにいく」など意味不明なことを供述しており精神的に極めて不安定な状態に……。
はい、ということで先日おもむろにサイコロプログラム作ろうとしたんですけどうまく作れなかったんですよ。今回、動作確認に利用した言語ってのが2019年もっとも学ぶべき言語トップのElmっていう超メジャーな言語でやったんですけどいやー難しいです。全然わかんねーや。
elm-lang.org
はてなブログって、そういうのに詳しい人いっぱいいると思うのでぜひとも教えてほしいです☆
もちろんお礼は無料です☆
追伸
なんかなんやかんやいじっていたらできた。
以下クソース*1
import Browser import Html exposing (..) import Html.Attributes exposing (..) import Html.Events exposing (..) import Random -- elm 0.19 main = Browser.element{ init = init, update = update, subscriptions = subscriptions, view = view } -- MODEL type alias Model = { dice : Int } init : () -> (Model, Cmd Msg) init _ = (Model 1, Cmd.none) -- Update type Msg = Roll | RollInt Int update : Msg -> Model -> (Model, Cmd Msg) update msg model = case msg of Roll -> (model, Random.generate RollInt (Random.int 1 6)) RollInt rollint -> (Model rollint, Cmd.none) -- SUBSCRIPTIONS subscriptions : Model -> Sub Msg subscriptions model = Sub.none -- View view : Model -> Html Msg view model = div [style "background" "black", style "color" "white", style "text-align" "center", style "width" "20%"] -- 撮影用スタイル [ h1[style "padding" "1.5em 0 0 0"] [text "Dice"], h1 [] [text (String.fromInt model.dice)], p [] [], input [onClick Roll, type_ "button", value "Roll" , style "margin" "1.5em 0"][] ]
敗因
HTTP通信しないんだからsandboxでいけるだろうとか思ってたらランダムやなんかもelementから使えるやつっぽいですね。
Commands and Subscriptions · An Introduction to Elm
雑Elmアーキテクチャ
sandboxだといじれるのはDOMだけっぽい。まずそこでハマった。まだ関数型言語になれていない証拠ですねこれは。
あと、ランダムの方もちゃんと読んでないこともあってこれでInt返ってくるものだと思ってた。なんやねんRandom.Generator型って…。
roll : Random.Generator Int roll = Random.int 1 6
そう、ここの部分読んでなかった。Random.generate
ではじめてMsgとCmdを使って副作用のある部分とそうでない部分切り分けて使うもんだってのを理解しました。学び始めが美しい文法を書くためとかそういうのでやっていないからこういう構成を理解するの後回しになってしまうのダメですね…。
So here we have three random generators. The roll generator is saying it will produce an Int, and more specifically, it will produce an integer between 1 and 6 inclusive. Likewise, the usuallyTrue generator is saying it will produce a Bool, and more specifically, it will be true 80% of the time.
The point is that we are not actually generating the values yet. We are just describing how to generate them. From there you use the Random.generate to turn it into a command:
generate : (a -> msg) -> Generator a -> Cmd msg
When the command is performed, the Generator produces some value, and then that gets turned into a message for your update function. So in our example, the Generator produces a value between 1 and 6, and then it gets turned into a message like NewFace 1 or NewFace 4. That is all we need to know to get our random dice rolls, but generators can do quite a bit more!
*1:ほぼサンプルのパクリです