如何在Haskell中获取'[String]的类型级值?

时间:2016-05-21 15:30:16

标签: haskell type-level-computation

我可以通过以下方式获取类型级String的值:

> :set -XDataKinds
> import Data.Proxy
> import GHC.TypeLits
> symbolVal (Proxy :: Proxy "test")
"test"

如何获取'[String]的值,例如Proxy :: Proxy '["a", "b", "c"]?我希望能够遍历代码中的值。

1 个答案:

答案 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)