Open7

[Elixir] 型安全に開発したい

snamiki1212snamiki1212

Elixirは動的型付け言語だが、できるかぎり型安全に開発したい。
型安全になりそうなものについて整理していく。

snamiki1212snamiki1212

GitHub - IvanRublev/Domo: A library to validate values of nested structs with their type spec t() and associated precondition functions

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"}}
snamiki1212snamiki1212

[最近の所感]

なるだけstrictにしたいという思いでいろいろ調べたけど、そもそも言語思想の時点でdynamicかつnon type-firstな時点で、どう頑張ってもlenientな方向性になる。

なので、ここらへんが最近の所感

  • 前提としてstrictな言語ではないことを理解しておく
  • strict の度合いについてを TS / Rust / Go と比較する時点で完全に間違ってる点
  • strictの期待値と妥協ポイントはかなり低めに見積もっておくべき
snamiki1212snamiki1212

公式でようやっと型システムの導入が始まったので整理

Gradual set-theoretic types — Elixir v1.17.0-dev

Gradual set-theoretic types: 日本語に訳すと漸進的集合論的型とかになりそう。日本語にしても何言ってるかわからんので1語ずつ整理していくと下記の理解。

  • Gradual: 漸進的 ≒ 段階的 ≒ 徐々に型システムを導入できる意味。既存の動いているElixirコードは動的型付けでそこに対して型を宣言していく必要があるので、この観点が必要になる。
  • set-theoretic types: 集合論的型。これは学術的な側面が強くて「集合論を使って型を表現している仕組み」と考えると良さそう。前の公式ドキュメントだと type system とも書かれてる。