2011-09-17 69 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