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 

私は基本的にこれが動作するようになっているか誤解だろうか?明らかに、(->)コンストラクタが2つの引数に適用されているので、なぜそれらを見ることができないのですか?私は実際にはかなり困惑して

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

:私はData.DynamicからdynApplyの方法で機能タイプをつついてみた場合、私は同様に不可解な結果を得ることができます。

私が役に立ったら、私は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] 

あなたはカリー化関数の引数の型を取得したい場合は、再帰関数の型を解体する必要があります。

+0

D'oh。これは私が 'typeOf2'がやるべきことを期待したものです。私は '* - > * - > *'コンストラクタの正しい選択であると期待して、バットを直ちに使用しました。しかし、私が調べている値が実際には '*'の値であることを忘れてしまいました。 – acfoltzer

1

方法について:

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

あなたはより高級なクラスで賢くなるよりも、まずそれを試してみたと思います...ありがとう。 – acfoltzer

関連する問題