使用代理
该 Proxy::k -> *
类型,在发现 Data.Proxy
例如,选择一个类型的类的实例 - -这是在运行时仍然不相关的,当你需要给编译器的一些类型的信息被使用。
{-# LANGUAGE PolyKinds #-}
data Proxy a = Proxy
使用 Proxy
的函数通常使用 ScopedTypeVariables
来选择基于 a
类型的类型类实例。
例如,模糊函数的经典示例,
showread::String -> String
showread = show . read
这导致类型错误,因为 elaborator 不知道使用 Show
或 Read
的哪个实例,可以使用 Proxy
解决:
{-# LANGUAGE ScopedTypeVariables #-}
import Data.Proxy
showread::forall a. (Show a, Read a) => Proxy a -> String -> String
showread _ = (show::a -> String) . read
当使用 Proxy
调用函数时,你需要使用类型注释来声明你的意思。
ghci> showread (Proxy::Proxy Int) "3"
"3"
ghci> showread (Proxy::Proxy Bool) "'m'" -- attempt to parse a char literal as a Bool
"*** Exception: Prelude.read: no parse