使用代理

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