Допустим, мне нужен другой вывод в зависимости от типа полиморфного параметра функции. Моя первоначальная попытка терпит неудачу с некоторым загадочным сообщением об ошибке:
choice :: a -> Int
choice (_ :: Int) = 0
choice (_ :: String) = 1
choice _ = 2
Однако мы можем легко исправить это, обернув нужные типы в разные конструкторы данных и используя их в сопоставлении с образцом:
data Choice a = IntChoice Int | StringChoice String | OtherChoice a
choice :: Choice a -> Int
choice (IntChoice _) = 0
choice (StringChoice _) = 1
choice (OtherChoice _) = 2
Вопрос. Знаете ли вы, как это обойти? Есть ли функция в Haskell2010, GHC или любом из расширений, которая позволяет мне использовать первый вариант (или что-то подобное)?
Data.Typeable
позволяет запрашивать типы во время выполнения, но его не следует использовать легкомысленно. - person chi   schedule 19.05.2015