使用代理

Proxy::k -> *类型,在发现 Data.Proxy 例如,选择一个类型的类的实例 - -这是在运行时仍然不相关的,当你需要给编译器的一些类型的信息被使用。

{-# LANGUAGE PolyKinds #-}

data Proxy a = Proxy

使用 Proxy 的函数通常使用 ScopedTypeVariables 来选择基于 a 类型的类型类实例。

例如,模糊函数的经典示例,

showread::String -> String
showread = show . read

这导致类型错误,因为 elaborator 不知道使用 ShowRead 的哪个实例,可以使用 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