我想编写以下函数:
data TypeEnum = IntType | FloatType | BoolType | DateType | StringType
data Schema = Object [Schema] |
Field TypeEnum |
Array Schema
schema :: Typeable a => a -> Schema
现在我可以获得给定构造函数的 TypeReps
列表,但我似乎找不到将 TypeRep
转换为 Schema 的方法
对于更复杂的类型:
field :: TypeRep t => t -> Schema
field t | t == typeOf (undefined :: String) = Field StringType
| t == typeOf (undefined :: Int) = Field IntType
| t == typeOf (undefined :: ???) = Array ???
| t == typeOf (undefined :: ???) = Object ???
它适用于 Int
和 String
等简单类型,但是 Typeable
或 [Typeable]
又如何呢?
最佳答案
您可以使用 typeOf1
获取单参数类型构造函数的类型:
> typeOf (undefined :: Array Int Int)
Array Int Int
> typeOf1 (undefined :: Array Int Int)
Array Int
> typeOf2 (undefined :: Array Int Int)
Array
> typeOf2 (undefined :: Array a b)
Array
编辑:抱歉,我误解了这个问题。这里有一些更有用的建议...您可以使用 splitTyConApp
将 TypeRep
拆分为其组成位。和 friend 们:
> splitTyConApp (typeOf (undefined :: Array Int Int))
(Array,[Int,Int])
> let arr = typeRepTyCon (typeOf (undefined :: Array Int Int))
> mkTyConApp arr [] == typeOf2 (undefined :: Array a b)
True
关于generics - 将 TypeRep 转换为具体的类型表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11795101/