【发布时间】:2018-07-26 09:58:05
【问题描述】:
我有一个 Nat 的简单定义和一个由 Nat 索引的类型的定义,Natty。
data Nat :: * where
Zero :: Nat
Suc :: Nat -> Nat deriving(Show, Typeable)
data Natty :: Nat -> * where
Zy :: Natty Zero
Sy :: Natty n -> Natty (Suc n) deriving Typeable
我想使用 Type.Reflection 模块以通用方式存储和操作这些 Natty。
将 Nat 存储为类型代表可以正常工作。
foo :: Nat -> SomeTypeRep
foo x = SomeTypeRep (typeOf x)
但是除非添加额外的约束,否则将 Natty 存储为类型代表是行不通的。
boo :: Natty n -> SomeTypeRep
boo x = SomeTypeRep (typeOf x)
boo 产生以下错误:
No instance for (Typeable n) arising from the use of 'typeOf'
我的问题是为什么 Haskell 不能识别 n 是一个 nat 并因此应该是 Typeable?
就像我说的那样,我可以通过将 Typeable n 的约束添加到 boo 的开头来解决这个问题,但是当我使用一个在另一个函数中间返回 natty 的函数时,它并不那么简单。
已使用以下扩展和导入。
{-# LANGUAGE DataKinds, KindSignatures, GADTs #-}
import Type.Reflection
【问题讨论】: