Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
入門SRTP - 型レベルプログラミングちょっとだけ入門
Search
0918nobita
May 22, 2021
Technology
0
400
入門SRTP - 型レベルプログラミングちょっとだけ入門
0918nobita
May 22, 2021
Tweet
Share
More Decks by 0918nobita
See All by 0918nobita
入門言語としての F#
0918nobita
0
450
プログラミング"言語"をはじめよう
0918nobita
0
52
RxJSで始めるリアクティブ・プログラミング と GitHub Emoji
0918nobita
1
97
Firebaseを使って作るPWA (LINE Developer Meetup #43)
0918nobita
1
810
OSSとライセンスの話
0918nobita
0
110
Other Decks in Technology
See All in Technology
Кто отправит outbox? Валентин Удальцов, автор канала Пых
lamodatech
0
330
AIエージェント最前線! Amazon Bedrock、Amazon Q、そしてMCPを使いこなそう
minorun365
PRO
13
4.8k
Agentic Workflowという選択肢を考える
tkikuchi1002
1
480
【TiDB GAME DAY 2025】Shadowverse: Worlds Beyond にみる TiDB 活用術
cygames
0
1k
mrubyと micro-ROSが繋ぐロボットの世界
kishima
2
140
Welcome to the LLM Club
koic
0
160
Liquid Glass革新とSwiftUI/UIKit進化
fumiyasac0921
0
180
低レイヤを知りたいPHPerのためのCコンパイラ作成入門 完全版 / Building a C Compiler for PHPers Who Want to Dive into Low-Level Programming - Expanded
tomzoh
4
3.1k
“社内”だけで完結していた私が、AWS Community Builder になるまで
nagisa53
1
350
ローカルLLMでファインチューニング
knishioka
0
150
Node-REDのFunctionノードでMCPサーバーの実装を試してみた / Node-RED × MCP 勉強会 vol.1
you
PRO
0
110
GitHub Copilot の概要
tomokusaba
1
130
Featured
See All Featured
Optimising Largest Contentful Paint
csswizardry
37
3.3k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
44
2.4k
The Invisible Side of Design
smashingmag
299
51k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
331
22k
A Modern Web Designer's Workflow
chriscoyier
693
190k
Why You Should Never Use an ORM
jnunemaker
PRO
56
9.4k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Thoughts on Productivity
jonyablonski
69
4.7k
The Power of CSS Pseudo Elements
geoffreycrofte
77
5.8k
Making Projects Easy
brettharned
116
6.3k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
GraphQLの誤解/rethinking-graphql
sonatard
71
11k
Transcript
入門SRTP 型レベルプログラミングちょっとだけ入門 第1回 Fun Fan Fsharp LT資料
|> 自己紹介 松本 幸大 (まつもと こうだい) 2000年2月16日生まれ (現在21歳) 放送大学教養学部 在学中
Twitter : @0918nobita GitHub : 0918nobita 好きなプログラミング言語 : F#, OCaml, Haskell, Lisp, Rust 一番使うプログラミング言語 : TypeScript (Webフロントエンド案件)
|> 自己紹介 趣味:プログラミング言語探求, PCゲーム(Apex Legends), 音楽ゲーム (CHUNITHM, Arcaea), 作曲(DTM), イラスト制作…etc.
オリジナル曲「Tonari’s Diary」 (SoundCloud) イラスト「最期に果たす決意」 (pixiv)
|> 2種類の型パラメータ • ジェネリック型パラメータ • 静的に解決される型パラメータ (SRTP: Statically Resolved Type
Parameters)
|> 2種類の型パラメータ • ジェネリック型パラメータ • 静的に解決される型パラメータ (SRTP: Statically Resolved Type
Parameters)
|> 2種類の型パラメータ [ジェネリック型パラメータ] (他の .NET 言語と共通)
|> 2種類の型パラメータ [ジェネリック型パラメータ] 異なる型の値を渡して呼び出せるが、生成される関数定義は1通りだけ → サンプルプログラムをコンパイルして得られたアセンブリ (.dll) を見てみる
ジェネリックな静的メソッドが1つだけ
|> 2種類の型パラメータ • ジェネリック型パラメータ • 静的に解決される型パラメータ (SRTP)
|> 2種類の型パラメータ [静的に解決される型パラメータ (SRTP)] F# 独自の言語機能で、コンパイル時に当てはめられる (解決される) 型が決まる
|> SRTP の「制約」 inline 関数・静的メソッドにおいて、引数が持っているべきメンバ関数とその型を 指定し、コンパイラに静的チェックさせられる (制約を推論してくれることもある)
|> SRTP の「メンバ呼び出し」 SRTP に対して、静的メンバを指定して呼び出せる 制約とは異なり、関数本体 (= 以降) で使用する ^X
は GetName : unit -> string を 静的メンバとして持っていなければならない メンバ制約
|> SRTP の「メンバ呼び出し」 SRTP に対して、静的メンバを指定して呼び出せる 制約とは異なり、関数本体 (= 以降) で使用する メンバ呼び出し
^X の持つ GetName 静的メソッドを、 第1引数に () を渡して呼び出す
None
|> SRTP の制約で推論型を取り出す SRTP の制約のなかで、引数では使っていない SRTP を新たに用いることもできる → そこに当てはまる (推論される)
型を取り出せる
|> SRTP の制約で推論型を取り出す メンバ制約 引数では直接使っていない SRTP
|> SRTP の制約で推論型を取り出す ^AorB の持つ GetName 静的メソッドを、 第1引数に () を渡して呼び出す
メンバ呼び出し
変化なし
|> F# での型レベルプログラミングの特異性 最終的な静的型の情報を実行時に持ってこれる (+ リフレクションで操作できる) → 型計算の結果によって実行時の挙動を変えられる TypeScript に代表されるような、実行時に静的型の情報が「消える」言語だと
このようなテクニックは通常使えない
|> 型レベル線形リストを定義する 取り出し・結合・反転などの操作に対して、 より厳格な型付けの行われる線形リストを定義してみる 値 型 Nil Nil Cons (T,
Nil) Cons<T, Nil> Cons (T, Cons (U, Nil)) Cons<T, Cons<U, Nil>>
|> 型レベル線形リストを定義する ここからは実際のソースコードを GitHub 上で確認したり、 ライブコーディングしながら話します 0918nobita/fs-typelevel https://git.io/Jsy8g
|> まとめ • SRTPはコンパイル時に決まる型パラメータ • メンバ制約を指定して、引数に渡せる値を制限できる • 推論型をパターンマッチ的に取り出せる • オーバーロードしてコンパイラに選択してもらえる
• 再帰的に型を計算させることも可能 • 最終的な型は実行時に持ち込んで活用できる
Next… 型レベルプログラミングで定義された型を楽に生成したい → F# より高レベルな言語でリテラルを記述して、F# の型に翻訳したい → TypeProvider が使えるかもしれない!? (現在調査中)
|> 参考文献 • Statically Resolved Type Parameters - F# |
Microsoft Docs • SRTP入門 by midoliy - Zenn • F# で型レベルプログラミング - SevenColoured
ご清聴ありがとうございました!