generated at
型を用いたError Handling
型システムを用いてError Handlingをする
コンパイル時に静的検査される
「失敗するかもしれない型」を用いる
どうやって値を取り出す?
パターンマッチが必ずある?
たいてい関数型の言語?
何が嬉しい?
誤ってnull値にアクセスすることがない
コンパイルエラーでnullチェックを強制される
型を見るだけで失敗する可能性があることがわかる
TSからちゃんとプログラミングを始めたmrsekutにとっては意外だったが、型を見るだけでそれがnullになりうるかどうかを判断できるのは実はすごいことなんだな
と、このツイートを見て思った
こういう型のパワーは代数的データ型の効用らしい(たぶんちょっとmrsekutの解釈に語弊がある) ref



Haskell
Maybe a 型は Just a もしくは Nothing を返す
「失敗するかもしれない」ことを表す型
hs
main = 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
型の後ろに ? つけるやつ
なので↑の型のものは書かないとコンパイラに怒られる
kt
var s : String? = null if(s != null) { s.length }
このifの中ではスマートキャストされnullableでない型にキャストされる
ここでは String
>Kotlinではnon-nullに代入した箇所で動的にnullチェックされるため、引数の?を付け忘れると実行時に死ぬref
コンパイル時の話?
あまり型が厳格でないのかな、わからんmrsekut


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



C#,
nullableとか



Java