Save 37% off PRO during our Black Friday Sale! »

入門SRTP - 型レベルプログラミングちょっとだけ入門

入門SRTP - 型レベルプログラミングちょっとだけ入門

2f710cd36766586d2b6210f2a2be2b97?s=128

0918nobita

May 22, 2021
Tweet

Transcript

  1. 入門SRTP 型レベルプログラミングちょっとだけ入門 第1回 Fun Fan Fsharp LT資料

  2. |> 自己紹介 松本 幸大 (まつもと こうだい) 2000年2月16日生まれ (現在21歳) 放送大学教養学部 在学中

    Twitter : @0918nobita GitHub : 0918nobita 好きなプログラミング言語 :  F#, OCaml, Haskell, Lisp, Rust 一番使うプログラミング言語 :  TypeScript (Webフロントエンド案件)
  3. |> 自己紹介 趣味:プログラミング言語探求, PCゲーム(Apex Legends), 音楽ゲーム (CHUNITHM, Arcaea), 作曲(DTM), イラスト制作…etc.

    オリジナル曲「Tonari’s Diary」 (SoundCloud) イラスト「最期に果たす決意」 (pixiv)
  4. |> 2種類の型パラメータ • ジェネリック型パラメータ • 静的に解決される型パラメータ (SRTP: Statically Resolved Type

    Parameters)
  5. |> 2種類の型パラメータ • ジェネリック型パラメータ • 静的に解決される型パラメータ (SRTP: Statically Resolved Type

    Parameters)
  6. |> 2種類の型パラメータ [ジェネリック型パラメータ] (他の .NET 言語と共通)

  7. |> 2種類の型パラメータ [ジェネリック型パラメータ] 異なる型の値を渡して呼び出せるが、生成される関数定義は1通りだけ → サンプルプログラムをコンパイルして得られたアセンブリ (.dll) を見てみる

  8. ジェネリックな静的メソッドが1つだけ

  9. |> 2種類の型パラメータ • ジェネリック型パラメータ • 静的に解決される型パラメータ (SRTP)

  10. |> 2種類の型パラメータ [静的に解決される型パラメータ (SRTP)] F# 独自の言語機能で、コンパイル時に当てはめられる (解決される) 型が決まる

  11. |> SRTP の「制約」 inline 関数・静的メソッドにおいて、引数が持っているべきメンバ関数とその型を 指定し、コンパイラに静的チェックさせられる (制約を推論してくれることもある)

  12. |> SRTP の「メンバ呼び出し」 SRTP に対して、静的メンバを指定して呼び出せる 制約とは異なり、関数本体 (= 以降) で使用する ^X

    は GetName : unit -> string を 静的メンバとして持っていなければならない メンバ制約
  13. |> SRTP の「メンバ呼び出し」 SRTP に対して、静的メンバを指定して呼び出せる 制約とは異なり、関数本体 (= 以降) で使用する メンバ呼び出し

    ^X の持つ GetName 静的メソッドを、 第1引数に () を渡して呼び出す
  14. None
  15. |> SRTP の制約で推論型を取り出す SRTP の制約のなかで、引数では使っていない SRTP を新たに用いることもできる → そこに当てはまる (推論される)

    型を取り出せる
  16. |> SRTP の制約で推論型を取り出す メンバ制約 引数では直接使っていない SRTP

  17. |> SRTP の制約で推論型を取り出す ^AorB の持つ GetName 静的メソッドを、 第1引数に () を渡して呼び出す

    メンバ呼び出し
  18. 変化なし

  19. |> F# での型レベルプログラミングの特異性 最終的な静的型の情報を実行時に持ってこれる (+ リフレクションで操作できる) → 型計算の結果によって実行時の挙動を変えられる TypeScript に代表されるような、実行時に静的型の情報が「消える」言語だと

    このようなテクニックは通常使えない
  20. |> 型レベル線形リストを定義する 取り出し・結合・反転などの操作に対して、 より厳格な型付けの行われる線形リストを定義してみる 値 型 Nil Nil Cons (T,

    Nil) Cons<T, Nil> Cons (T, Cons (U, Nil)) Cons<T, Cons<U, Nil>>
  21. |> 型レベル線形リストを定義する ここからは実際のソースコードを GitHub 上で確認したり、 ライブコーディングしながら話します 0918nobita/fs-typelevel https://git.io/Jsy8g

  22. |> まとめ • SRTPはコンパイル時に決まる型パラメータ • メンバ制約を指定して、引数に渡せる値を制限できる • 推論型をパターンマッチ的に取り出せる • オーバーロードしてコンパイラに選択してもらえる

    • 再帰的に型を計算させることも可能 • 最終的な型は実行時に持ち込んで活用できる
  23. Next… 型レベルプログラミングで定義された型を楽に生成したい → F# より高レベルな言語でリテラルを記述して、F# の型に翻訳したい → TypeProvider が使えるかもしれない!? (現在調査中)

  24. |> 参考文献 • Statically Resolved Type Parameters - F# |

    Microsoft Docs • SRTP入門 by midoliy - Zenn • F# で型レベルプログラミング - SevenColoured
  25. ご清聴ありがとうございました!