Open7
[Elixir] 型安全に開発したい
Elixirは動的型付け言語だが、できるかぎり型安全に開発したい。
型安全になりそうなものについて整理していく。
Validatorのhex。他のValidatorとは違って型定義から自動生成してくれたりする。
- Validator生成:型情報からvalidatorを自動生成してくれる
- Pre-condition:structを生成するときにpre-condition を定義してvalidateを実行できる
- NestedStruct:structに対してnestしてるstructに対しても動作してくれる
defmodule D do
use Domo
use TypedStruct
typedstruct do
field :name, String.t(), enforce: true
end
end
# iex ---
# use validator
iex(1)> %D{name: 0} |> D.ensure_type
{:error,
[
name: "Invalid value 0 for field :name of %D{}. Expected the value matching the <<_::_*8>> type."
]}
iex(2)> %D{name: "Nash"} |> D.ensure_type
{:ok, %D{name: "Nash"}}
[最近の所感]
なるだけstrictにしたいという思いでいろいろ調べたけど、そもそも言語思想の時点でdynamicかつnon type-firstな時点で、どう頑張ってもlenientな方向性になる。
なので、ここらへんが最近の所感
- 前提としてstrictな言語ではないことを理解しておく
- strict の度合いについてを TS / Rust / Go と比較する時点で完全に間違ってる点
- strictの期待値と妥協ポイントはかなり低めに見積もっておくべき
Elixir への型システムをについて研究が始まってるとか。
公式でようやっと型システムの導入が始まったので整理
Gradual set-theoretic types — Elixir v1.17.0-dev
Gradual set-theoretic types: 日本語に訳すと漸進的集合論的型とかになりそう。日本語にしても何言ってるかわからんので1語ずつ整理していくと下記の理解。
- Gradual: 漸進的 ≒ 段階的 ≒ 徐々に型システムを導入できる意味。既存の動いているElixirコードは動的型付けでそこに対して型を宣言していく必要があるので、この観点が必要になる。
- set-theoretic types: 集合論的型。これは学術的な側面が強くて「集合論を使って型を表現している仕組み」と考えると良さそう。前の公式ドキュメントだと type system とも書かれてる。