Вероятно, на это уже давно есть ответ, но я даже не знаю как правильно загуглить.
Например, такой код:
import Data.List
main = print $ nub []
не компилируется. Причины понятны, решение (указать тип списка явно с любым типом элементов, для которого реализован, в данном случае, Eq) тоже.
Но это как-то криво, поэтому прошу подсказать, как можно реализовать (типизировать) nub (и любую другую подобную функцию), которая принимала бы пустой список произвольного типа, несмотря на то, что требует список элементов какого-то типа определённого тайпкласса. У length, например, проблем нет, т.к. она не ограничивает тип элементов тайпклассом.
P.S. Typed Racket, например, такое легко позволяет (хотя автоматически вывести тип для nub не может):
(: nub (All (a) (-> (Listof a) Any)))
(define (nub xs)
(match xs
((list) #t)
((cons x xs) (and (not (member x xs))
(nub xs)))))
(print (nub '())) ;=> #t
Тут, правда, и тайпклассов нет. =)
Предполагаю, что языки с зависимыми типами также такой проблемы не имеют.