多态代理习语
由于 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'"