コミュ障だから明日が僕らをよんだって返事もろくにしなかった

何かを創る人に憧れたからブログをはじめたんだと思うよ

マジムリ……サイコロプログラムすらつくれない……プログラミング向いてない……リスカしよ

【悲報】ランダムに1から6のサイコロ出目を表示するコードを書けないことが判明

最新の研究により、僕が任意のプログラミング言語を用いてごく簡単な処理を行うソースコードが書けないということが分かりました。その結果、僕が絶望的にプログラミングに向いていないということが証明されてしまいました。なお現在、「今後は刺身の上にタンポポをのせる仕事を探しにいく」など意味不明なことを供述しており精神的に極めて不安定な状態に……。


はい、ということで先日おもむろにサイコロプログラム作ろうとしたんですけどうまく作れなかったんですよ。今回、動作確認に利用した言語ってのが2019年もっとも学ぶべき言語トップのElmっていう超メジャーな言語でやったんですけどいやー難しいです。全然わかんねーや。
elm-lang.org


はてなブログって、そういうのに詳しい人いっぱいいると思うのでぜひとも教えてほしいです☆
もちろんお礼は無料です☆






追伸

なんかなんやかんやいじっていたらできた。
f:id:andron:20190529230711g:plain

以下クソース*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アーキテクチャ
f:id:andron:20190529232902p:plain
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!

random 1.0.0

*1:ほぼサンプルのパクリです