将类型级别列表转换为值

And*_*tin 6 haskell ghc type-level-computation

该模块GHC.TypeLits目前提供natValsymbolVal,这使我们能够获得从类型的一种运行时值NatSymbol.有没有办法让类型的运行时值[String]出型样的'[Symbol]?我看不出一个明显的方法来做到这一点.我可以想到一个使用类型类的东西OverlappingInstances,但似乎GHC应该已经有了这个功能.

Cir*_*dec 7

symbolVal可以映射到类型级别列表.为此,我们需要ScopedTypeVariables并且PolyKinds除了DataKinds和之外TypeOperators.

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE PolyKinds #-}

import Data.Proxy
import GHC.TypeLits
Run Code Online (Sandbox Code Playgroud)

我们将定义我们可以"获得类型的运行时值"的类型(任何类型)[String].

class SymbolVals a where
    symbolVals :: proxy a -> [String]
Run Code Online (Sandbox Code Playgroud)

我们可以获得任何类型的空列表的字符串列表.

instance SymbolVals '[] where
    symbolVals _ = []
Run Code Online (Sandbox Code Playgroud)

我们可以获得任何类型列表的字符串列表,其中我们可以获得第一种类型的字符串和余数的字符串列表.

instance (KnownSymbol h, SymbolVals t) => SymbolVals (h ': t) where
    symbolVals _ = symbolVal (Proxy :: Proxy h) : symbolVals (Proxy :: Proxy t)
Run Code Online (Sandbox Code Playgroud)