generics - 将 TypeRep 转换为具体的类型表示

标签 generics haskell types schema type-conversion

我想编写以下函数:

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 ???

它适用于 IntString 等简单类型,但是 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

编辑:抱歉,我误解了这个问题。这里有一些更有用的建议...您可以使用 splitTyConAppTypeRep 拆分为其组成位。和 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/

相关文章:

haskell - 无限列表的有限理解

string - Delphi XE3 : What are the new types, MarshaledString 和 MarshaledAString 有何用途?

javascript - 如何在 React 中使用 Flow 类型?

generics - 如何使用静态解析的类型参数解决递归映射中的奇怪类型错误?

Java,通用启用对象列表的隐式和显式类型转换

java - 扩展或等于的通用语法

c - 为什么类型转换为 void 指针?

java - 将 Generic Arraylist 转换为具有 Generic Type 的数组

haskell - Lisp 能否以不可变的函数式方式轻松使用?

haskell - Haskell 的纯度是由类型系统或 IO 的实现强制执行的吗?