拆分应用构造函数的 TypeReps

发布于 2024-12-05 09:21:12 字数 886 浏览 0 评论 0原文

我正在尝试使用 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

孤独患者 2024-12-12 09:21:12

您需要使用空版本 typeOf

Prelude Data.Typeable> typeRepArgs $ typeOf (undefined :: Int -> Int)
[Int,Int]

但是,这可能不会达到您的预期。它给出类型构造函数 (->) 的类型参数,因此对于具有多个参数的函数,您会得到类似这样的结果。

Prelude Data.Typeable> typeRepArgs $ typeOf (undefined :: Int -> Int -> Int)
[Int,Int -> Int]

如果你想获取柯里化函数的参数类型,你必须递归地解构函数类型。

You need to use the nullary version typeOf

Prelude Data.Typeable> typeRepArgs $ typeOf (undefined :: Int -> Int)
[Int,Int]

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.

Prelude Data.Typeable> typeRepArgs $ typeOf (undefined :: Int -> Int -> Int)
[Int,Int -> Int]

If you want to get the argument types of a curried function, you'll have to recursively deconstruct the function type.

初相遇 2024-12-12 09:21:12

怎么样:

Prelude Data.Typeable> typeRepArgs (typeOf (id :: Integer -> Integer))
[Integer,Integer]

How about:

Prelude Data.Typeable> typeRepArgs (typeOf (id :: Integer -> Integer))
[Integer,Integer]
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文