我可以通过以下方式获取类型级String
的值:
> :set -XDataKinds
> import Data.Proxy
> import GHC.TypeLits
> symbolVal (Proxy :: Proxy "test")
"test"
如何获取'[String]
的值,例如Proxy :: Proxy '["a", "b", "c"]
?我希望能够遍历代码中的值。
答案 0 :(得分:5)
可以通过制作另一个类型类来解决:
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE TypeOperators #-}
import Data.Proxy
import GHC.TypeLits
class ManySymbolVal (xs :: [Symbol]) where
manySymbolVal :: proxy xs -> [String]
instance ManySymbolVal '[] where
manySymbolVal _ = []
instance (KnownSymbol a, ManySymbolVal as) => ManySymbolVal (a ': as) where
manySymbolVal _ =
symbolVal (Proxy :: Proxy a) : manySymbolVal (Proxy :: Proxy as)
myProxy :: Proxy '["hello","small","world"]
myProxy = Proxy
main :: IO ()
main = mapM_ putStrLn (manySymbolVal myProxy)