型変数を伴う型宣言に関する質問
調べながら書いているのでまとまっていませんが一応質問ですmoyamin.icon 型変数を持つのに、右辺に型変数が登場しないのは何なのか? 調べてたら一応納得はできました
単純な宣言
書いてたらわかったので解説にした
code:elm
type Maybe a
= Just a
| Nothing
これもわかる
code:elm
String.toFloat
<function> : String -> Maybe Float
String.toFloat "3.1415"
Just 3.1415 : Maybe Float
正しく出力が得られるか分からない関数の戻り値にMaybe aを使って、
Just aかNothingを返すようにしている
replで確認すると
NothingはMaybe a型
Just 1はMaybe number型
Justはa -> Maybe a型の関数を返す
代入するまで、具体的な型が決まらない?
コンストラクタに引数で値を渡せば、型変数の解決が行われて、型が決まる
型変数が渡されていないときは、解決を保留して、Nothing : Maybe aのまま、値として扱うことができる
(==) Nothing NothingはTrue
型引数を解決していなくても、Trueが返ってくる
型変数があるのに、右辺に現れない場合
type Node msg = Node
これがとくにわからない
文法的には、
型名とコンストラクタ名が同一であるのは理解した
Maybeの宣言のなかでJustを省いたものにおなじになるはず
type Maybe a = Just a | Nothing
文法的に特殊なことをしているわけではないっぽい
例
htmlのnodeとかで出てくる
node : String -> List (Attribute msg) -> List (Node msg) -> Node msg
Html.Attribute
type alias Attribute msg = VirtualDom.Attribute msg
type Attribute msg = Attribute
type Node msg = Node
Html.events.onClick
code:elm
onClick : msg -> Attribute msg
onClick msg =
on "click" (Json.succeed msg)
1行目、msgが型変数になっている
2行目、msgは引数
解釈
型の情報は渡したいが、具体的な値を生成するときには必要ない、ということっぽい?moyamin.icon
Attribute msgに関して言えば
たとえば単純なカンターのサンプルのviewにonClick Incrementとか書いたりしますね
Incrementは、ユーザが勝手にtype Msg = ~~という記述をmain.elmとかで宣言するもの
なので onClick IncrementはAttriute Msg型になる
それでviewでわたすnodeのなかに埋め込むので
node自体は、ユーザが勝手に作ったMsgに依存するはず
それをハンドリングするためにtype Node msg = Nodeみたいに型変数を伴って宣言されている
そして、実際のMsgの値はonClickの中ではハンドリングはするが、
nodeとかの関数内では触るはずがない ので、握りつぶすために 右辺に型変数が無い
この理解で合っているっぽい?moyamin.icon
型変数を受け取るNodeと、値構築子であるNodeが同じ名前なのがややこしさがある
型変数を受け取る方は、当然annotationにしか現れない