2011-09-17 1 views
1

Data.Typeable을 사용하여 함수 유형의 구성 요소 유형을 검사하려고합니다. 처음에는 typeRepArgs는 완벽한 외모,하지만 난 그것을 얻이 수없는 것 :분할 유형 적용된 구성 요소의 회수

Prelude Data.Typeable> typeRepArgs (typeOf2 (id :: Integer -> Integer)) 
[] 
Prelude Data.Typeable> length $ typeRepArgs (typeOf2 (id :: Integer -> Integer)) 
0 

내가 근본적으로 이것이 작동하도록되어 어떻게 오해 있습니까? 분명히 (->) 생성자가 두 개의 인수에 적용되는데 왜 내가 볼 수 없습니까?

Prelude Data.Typeable> funResultTy (typeOf2 (id :: Integer -> Integer)) (typeOf (0 :: Integer)) 
Nothing 

정말 아주 난처한 상황에 빠진 해요 : 나는 Data.Dynamic에서 dynApply의 방법으로 함수 타입을 괴롭히는하려고하면, 나는 비슷한 수수께끼 결과를 얻을.

도움이된다면 GHC 7.0.4를 사용하고 있습니다.

답변

2

당신은 그러나 null의 버전 typeOf

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

을 사용할 필요가, 이것은 당신이 기대하는 일을하지 않을 수 있습니다. 그것은 타입 생성자 (->)의 타입 인자를 제공하므로, 하나 이상의 인자를 가진 함수의 경우 이와 비슷한 것을 얻을 수 있습니다.

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

카레 함수의 인수 유형을 가져 오려면 함수 유형을 재귀 적으로 분해해야합니다.

+0

D' oh. 이것은 정확히'typeOf2'가 기대했던 것입니다. 나는 그것을 방망이 바로 사용하여'* -> * -> *'생성자에 대해 올바른 선택이 될 것이라고 기대했지만, 실제로 검사하는 값이 사실'*'인 것을 잊었습니다. – acfoltzer

1

방법에 대해 :

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

당신은 더 높은 종류의 클래스들로 영리 해지는 것보다 먼저 시도했을 것이라고 생각합니다. 고마워요. – acfoltzer