多态代理习语

由于 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'"