yllan

Nowhere differentiable curve

0 notes

Phantom Types

Phantom Types 是一種 parameterized type (例如 java/C++ 中的 generic ),但傳進來的 type 和真正的資料並沒有關係。

例如

這個例子裡,Biography 和 Comic 只是一種 metadata,來標示 Book 物件的狀態或特性。我們可以利用 compiler 作 type checking,來設計出不易出錯的 API。

本例中,若是讓 Marvel 出版 Isaacson 寫的 Steve Jobs 傳就會發生 compile error。

當然,讓 ComicBiography 繼承 Book 就好了,同樣也可以達到目的,用 Phantom Types 的好處在哪裡呢?

Phantom types 的好處是他可以用多個 parametric type 組合出更複雜的標示。例如我可以製造出 Book<BookType, Language> 限定某 API 只能處理日文的漫畫書。

(但這邊用 Java 不算是個好例子,只要我 Book b = isaacWrite("Steve Jobs"); 就會把 b 所帶的 Type 資訊給洗掉。)