2011-09-17 68 views
1

我试图使用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。

回答

2

您需要使用无参版本typeOf

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

然而,这可能不是你所期待的东西。它给出了类型构造函数(->)的类型参数,所以对于具有多个参数的函数,你可以得到类似这样的东西。

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

如果你想获得一个curried函数的参数类型,你必须递归地解构函数类型。

+0

D'oh。这正是我期望'typeOf2'做的。我马上使用它,期待它成为'* - > * - > *'构造函数的正确选择,但忘记了我正在检查的值实际上是'*'种类。 – acfoltzer

1

如何:

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

你会认为我会先尝试,而不是更聪明的更高级的类......谢谢。 – acfoltzer