2016-05-21 8 views
2

私は次のようにタイプレベルStringの値を取得することができますHaskellの '[String]型の値を取得するには?

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

はどのように私はそのようなProxy :: Proxy '["a", "b", "c"]として、'[String]の値を取得する方法について行くのですか?私はコード内の値を繰り返し処理できるようにしたいと思います。

+0

あなたは種類「文字列の種類を列挙したいと思いますか? – nicolas

答えて

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) 
+0

ありがとう!これは、タイプレベルでリストを反復処理する組み込みの方法がないことを意味し、カスタムタイプのクラスを使用する必要がありますか? – rityzmon

+0

私が知る限り、タイプキャスティングよりも優れた方法はなく、タイプレベルのリストを反復するための 'base'パッケージには関数がありません。しかし、 'Nat'と' KnownSymbol'の型レベルリストのためにトラバースをパッケージ化する便利なdandy 'typelits-witnesses'パッケージがあります。 https://hackage.haskell.org/package/typelits-witnesses-0.2.0.0/docs/GHC-TypeLits-List.html#t:SymbolList //このフードの下には、これと同じテクニックを使用しています素晴らしい答えです( 'KnownSymbols'クラスとインスタンスのソースを参照してください)。 – hao

関連する問題