多型代理習語

由於 Proxy 不包含執行時資訊,因此無需在 Proxy 建構函式上進行模式匹配。因此,一個常見的習慣是使用型別變數抽象 Proxy 資料型別。

showread::forall proxy a. (Show a, Read a) => proxy a -> String -> String
showread _ = (show::a -> String) . read

現在,如果你碰巧在一些 f 的範圍內有一個 f a,你在呼叫 f 時不需要寫出 Proxy::Proxy a

ghci> let chars = "foo"  -- chars :: [Char]
ghci> showread chars "'a'"
"'a'"