Левые части ->
в выражении case
являются шаблонами , а не выражениями .Шаблон stringType
будет соответствовать чему угодно и привязывать к нему локальное имя stringType
. не сравнивается на равенство.
Компилятор сообщает вам, что ваши шаблоны intType
и _
никогда не будут достигнуты;Поскольку шаблон stringType
стоит первым и соответствует чему-либо, всегда будет выбрана его правая сторона.
Как предположил Клавдиу, вы захотите использовать охрану.Нечто подобное должно сработать:
dynFunc d | rep == stringType = ...
| rep == intType = ...
| otherwise = error ...
where rep = dynTypeRep d
Если у вас много возможностей, вы можете рассмотреть возможность составления списка и использования функции lookup
.