型を用いたError Handling
コンパイル時に静的検査される
「失敗するかもしれない型」を用いる
どうやって値を取り出す?
パターンマッチが必ずある?
たいてい関数型の言語?
何が嬉しい?
誤ってnull値にアクセスすることがない
コンパイルエラーでnullチェックを強制される
型を見るだけで失敗する可能性があることがわかる
TSからちゃんとプログラミングを始めた

にとっては意外だったが、型を見るだけでそれがnullになりうるかどうかを判断できるのは実はすごいことなんだな
Haskell
Maybe a
型は Just a
もしくは Nothing
を返す
「失敗するかもしれない」ことを表す型
hsmain = do
a1 <- 失敗するかもしれない処理1
a2 <- 失敗するかもしれない処理2 a1
..
のように処理を続けて行った場合どこか失敗( Nothing
)になると、それから先は全てNothingになる
Just
と Nothing
は論理和のような関係で、全体の結果が決まる
Either a b
型は Left a
もしくは Right b
を返す
Maybe型とほぼ同じ
失敗を表す Left a
の時に例えば Left String
のようにすると、エラーが起きた理由をエラーメッセージとして返すことが出来る
Maybe
型も Either
型もFunctor, Applicative, Monadの型クラスのインスタンスである
Scala
Option[T]
型
Some[T]
もしくは None
を返す
getOrElse()
を使って値を取り出す
引数はNoneの場合に返すT型のdefault value
Either[A, B]
型
Left[A, B]
もしくは Right[A, B]
を返す
Try
型
Eitherと似ているが失敗時には例外を保持する
非同期処理の try/catch
では例外を捕捉できない
Success
もしくは Failure
を返す
Rust
Elm
Maybe, Either
Swift
Kotlin
Null Safety
型の後ろに ?
つけるやつ
なので↑の型のものは書かないとコンパイラに怒られる
ktvar s : String? = null
if(s != null) {
s.length
}
このifの中ではスマートキャストされnullableでない型にキャストされる
ここでは String
型
>Kotlinではnon-nullに代入した箇所で動的にnullチェックされるため、引数の?を付け忘れると実行時に死ぬref
コンパイル時の話?
あまり型が厳格でないのかな、わからん

TypeScript
Union型を使えば同じことができる
strict: true
にしておけばnullチェックが強制される
type A = string | null
type A = string?
でも同じ、ではない
以下の様に書くことが強制される
tsconst s: string | null = null;
if (s != null) {
s.length; // OK
}
チェックする箇所を多少減らせる
nullチェックの記述が簡潔になる
穴もある
anyを使うとnull安全機能は局所的に無になる
そもそもunsafeな書き方ができる
tsconfigで strict: true
にしてないとチェックをしてくれない
漸進的型付けが出来るためにanyがあるので、本来0からTypeScriptで書くならanyは一切不要、な気もする
外部ライブラリとのアレはあるが
C#,
Java