Расщепление TypeReps прикладных конструкторов - PullRequest
1 голос
/ 17 сентября 2011

Я пытаюсь использовать Data.Typeable для проверки типов компонентов типа функции. Сначала typeRepArgs выглядит идеально, но я не могу заставить его работать:

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

Я в корне не понимаю, как это должно работать? Очевидно, конструктор (->) применяется к двум аргументам, так почему я не могу их увидеть? Если я попытаюсь подтолкнуть тип функции способом dynApply из Data.Dynamic, я получу такой же удивительный результат:

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

Я действительно очень озадачен.

Если это поможет, я использую GHC 7.0.4.

Ответы [ 2 ]

2 голосов
/ 17 сентября 2011

Вам нужно использовать нулевую версию typeOf

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

Однако, это может не сработать так, как вы ожидаете.Он дает аргументы типа конструктора типа (->), поэтому для функции с более чем одним аргументом вы получите что-то вроде этого.

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

Если вы хотите получить типы аргументов функции карри,вам придется рекурсивно деконструировать тип функции.

1 голос
/ 17 сентября 2011

Как насчет:

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