使用代理
該 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