幽霊型
PhantomType
以下の様な型のxのこと
code:hs
data PhantomType x a = PhantomType a
左辺では2つの型変数を取るが、右辺では一つの型しか使っていない
使われていない型のことを幽霊型と呼ぶ
この例ではx
「Phaontom Type」はDomain Specific Embedded Compilersという論文が出典らしい?
pdf
何が嬉しいのか
こういう型を定義したときに
code:hs
data PhantomType x a = PhantomType a
こういうふうに型を別物として扱うことができる
code:hs
data PostId
data UserId
type UID = PhantomType UserId Int
type PID = PhantomType PostId Int
UIDもPIDも型のbodyは同じくPhantomType Intである
であるにも関わらずUIDとPIDは全く別物として扱うことができる
仮に幽霊型を使っていなければ以下のようになる
code:hs
data Id a = Id a
type PostId = Int
type UserId = Int
type UID = Id UserId
type PID = Id PostId
PostIdもUserIdも実質Intなので、
UIDとPIDは両方とも実質Id Intとなり、区別がつかない
どこで使えるのか
同じprimitiveな型だが区別したいときに使える
暗号文(Int)と平文(Int)
PostId(Int)とUserId(Int)
日付(String)
日付にも時間を含むものと、含まないものある
両方ともにStringだとうまく解析が出来なくてバグる
#??
newtypeがあるのになぜ幽霊型が必要になる?
こうすると型のbodyが異なるものになっちゃうから?
code:hs
newtype PostId = PostId Int
newtype UserId = UserId Int
つまりbodyが異なるものでも良くて、primitiveな型を区別したいケースなら幽霊型は必要にならない
「幽霊型」の指すものが曖昧
「幽霊型」の意味がややこしい
定義: data PhantomType x a = PhantomTypeC a
使用: PhantomType X A
とするときに、 
Xのことを幽霊型と呼ぶ派
PhantomTypeのことを幽霊型と呼ぶ派
その他
などあって人によってバラバラ
言語別
TypeScript
構造的部分型なのでbranded typesを使うと良い
https://dev.to/busypeoples/notes-on-typescript-phantom-types-kg9
https://medium.com/@dhruvrajvanshi/advanced-typescript-patterns-6cf8826c7944
TypeScriptでtype predicateを安全に使う方法 | Tkr Blog
Scala
https://www.slideshare.net/AkinoriAbe1/aja-2016623
Haskell
https://qiita.com/HirotoShioi/items/3444e215070144b8ca0f
わかりやすいが、コメントでも指摘されている通り例が少し適切でない
https://wiki.haskell.org/Phantom_type
OCaml
https://rainyday.blog.so-net.ne.jp/2007-05-27
Elm
https://qiita.com/nobkz/items/5926257a375a4a181dde
Rust
https://doc.rust-jp.rs/rust-by-example-ja/generics/phantom.html
Swift
https://qiita.com/taketo1024/items/71e3272211f08d7e0cde
参考
/LugendrePublic/ゆうれい,いぞん,そんざい,ラァゥンクトゥゥポリモォフィジゥムッ
https://keens.github.io/blog/2015/05/24/yuureikatawoshitta/
https://www.slideshare.net/konn/how-wonderful-to-be-statically-typed
https://kagamilove0707.github.io/programming/2014/02/20/about-phantom-type/
http://akabe.github.io/2015/11/PhantomTypeSubtypingIntro
https://www.slideshare.net/AkinoriAbe1/aja-2016623
/namaozi/Nominal Typing, Structural Typing
https://www.izumisy.work/entry/2020/01/04/154007
https://www.cs.rit.edu/~mtf/research/phantom-subtyping/jfp06/jfp06.pdf
https://www.youtube.com/watch?v=cyOvlaweUtw&feature=youtu.be
https://pbrisbin.com/posts/phantom-types-and-globbing-bugs/
https://kowainik.github.io/posts/haskell-mini-patterns#phantom-type-parameters
functional mini patterns