拆分应用构造函数的 TypeReps
我正在尝试使用 Data. Typeable
用于检查函数类型的组件类型。首先, typeRepArgs
看起来很完美,但我似乎无法让它工作:
Prelude Data.Typeable> typeRepArgs (typeOf2 (id :: Integer -> Integer))
[]
Prelude Data.Typeable> length $ typeRepArgs (typeOf2 (id :: Integer -> Integer))
0
我是否从根本上误解了它应该如何工作?显然 (->)
构造函数被应用于两个参数,那么为什么我看不到它们呢?如果我尝试从 Data.Dynamic
中以 dynApply
的方式刺激函数类型,我会得到类似的令人费解的结果:
Prelude Data.Typeable> funResultTy (typeOf2 (id :: Integer -> Integer)) (typeOf (0 :: Integer))
Nothing
我真的很困惑。
如果有帮助,我正在使用 GHC 7.0.4。
I'm trying to use Data.Typeable
to inspect the component types of a function type. At first, typeRepArgs
looks perfect, but I can't seem to get it to work:
Prelude Data.Typeable> typeRepArgs (typeOf2 (id :: Integer -> Integer))
[]
Prelude Data.Typeable> length $ typeRepArgs (typeOf2 (id :: Integer -> Integer))
0
Am I fundamentally misunderstanding how this is supposed to work? Clearly the (->)
constructor is being applied to two arguments, so why can't I see them? If I try prodding the function type in the way of dynApply
from Data.Dynamic
, I get a similarly puzzling result:
Prelude Data.Typeable> funResultTy (typeOf2 (id :: Integer -> Integer)) (typeOf (0 :: Integer))
Nothing
I'm really quite stumped.
If it helps, I'm using GHC 7.0.4.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您需要使用空版本
typeOf
但是,这可能不会达到您的预期。它给出类型构造函数
(->)
的类型参数,因此对于具有多个参数的函数,您会得到类似这样的结果。如果你想获取柯里化函数的参数类型,你必须递归地解构函数类型。
You need to use the nullary version
typeOf
However, this might not do what you'd expect. It gives the type arguments of the type constructor
(->)
, so for a function with more than one argument you get something like this.If you want to get the argument types of a curried function, you'll have to recursively deconstruct the function type.
怎么样:
How about: