模块GHC.TypeLits当前提供natVal
和symbolVal
,它们允许我们从类型Nat
或Symbol
获取运行时值。有没有办法从类型'[Symbol]
中获得类型为[String]
的运行时值?我看不到一个明显的方式来做到这一点。我可以想象一个使用类型为OverlappingInstances
的类型类型,但好像GHC应该已经有了这个功能。将类型级别列表转换为值
6
A
回答
7
symbolVal
可以映射到类型级别列表上。为此,我们需要ScopedTypeVariables
和PolyKinds
以及DataKinds
和TypeOperators
。
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE PolyKinds #-}
import Data.Proxy
import GHC.TypeLits
我们将定义的类(任何种类的)的,我们可以“获得[String]
类型的运行值”类型。
class SymbolVals a where
symbolVals :: proxy a -> [String]
我们可以得到任何空类型列表的字符串列表。
instance SymbolVals '[] where
symbolVals _ = []
我们可以得到一个字符串列表的类型,我们可以得到的第一类型和其余的字符串列表字符串的任何列表。
instance (KnownSymbol h, SymbolVals t) => SymbolVals (h ': t) where
symbolVals _ = symbolVal (Proxy :: Proxy h) : symbolVals (Proxy :: Proxy t)
+0
啊,非常好。我忘记了这不会是一个需要'OverlappingInstances'的场景,因为''[]'和'(h':t)'不会重叠。谢谢。 – 2015-02-23 19:40:49
2
我建议使用singletons
库。你有你需要的一切,但使用Sing
,而不是Proxy
类型:
$ stack ghci --package singletons
Configuring GHCi with the following packages:
GHCi, version 8.0.1: http://www.haskell.org/ghc/ :? for help
Prelude> :set -XDataKinds
Prelude> import Data.Singletons.Prelude
Prelude Data.Singletons.Prelude> fromSing (sing :: Sing '["a","b"])
["a","b"]
Prelude Data.Singletons.Prelude> :t fromSing (sing :: Sing '["a","b"])
fromSing (sing :: Sing '["a","b"]) :: [String]
相关问题
- 1. 将动态类型转换为列表
- 2. 如何将列级别值转换为R中的单个行?
- 3. AutoMapper.ProjectTo与字段级别类型转换
- 4. 如何将“列表类型的Hashmap值”转换为Set?
- 5. 将“objects”类型的列表框项目转换为类型“int”
- 6. 我如何在Python中将列表类型转换为数值类型
- 7. 将匿名类型列表转换为绑定列表
- 8. 我应该如何将str类型列表转换为列表?
- 9. 直接将非列表类型转换为列表
- 10. 将标题和行级别数据转换为列级
- 11. 将字符串值转换为类型
- 12. vb.net Json将值转换为类型
- 13. 将泛型类型转换为列表框控件
- 14. 将ISingleResult列表值转换为我的班级没有循环
- 15. 无法将类型通用列表隐式转换为类
- 16. 熊猫将列类型从列表转换为np.array
- 17. 将VB转换为C#类型转换
- 18. 将DataTable转换为泛型列表?
- 19. Excel图表:将Y轴值转换为Y轴类别
- 20. 将数据从标题级别转换为行级别
- 21. 将类型转换为myType
- 22. 将类型转换为python
- 23. 将类型转换为拆箱类型
- 24. Gatling - 将json响应转换为案例类别列表
- 25. 将表示为sql_variant类型列值的字节数组转换为long/int64
- 26. 球拍,将列表转换为值
- 27. 如何将列表值转换为int
- 28. 将字典值转换为列表?
- 29. 将列表转换为多值字典
- 30. C++级联类型转换
你有没有兴趣像'FORALL(XS :: [符号]) - > HList XS - > [字符串]'或'FORALL( xs :: [Symbol]) - > Proxy xs - > [String]'。前者很简单,后者稍简单一些(你需要在xs上有一个类型约束)。 – user2407038 2015-02-23 04:05:50
我正在寻找后者。虽然我很想知道前者是如何完成的(但在我看来,那种'HList(xs ::'[Symbol])'更像是一个列表列表)。另外,我从来没有见过像这样用过的'forall'。在它量化的东西之后不应该有一段时间吗? – 2015-02-23 12:06:17