История изменений
Исправление qnikst, (текущая версия) :
Причина почему это сделать не так просто как ты хочешь:
Prelude Data.List> print (nub [] :: [Int])
[]
Prelude Data.List> print (nub [] :: [Char])
""
Причины понятны, решение (указать тип списка явно с любым типом элементов, для которого реализован, в данном случае, Eq) тоже.
решение, сделать так, чтобы компилятор мог выбрать словарь или таскать его в рантайме.
Но это как-то криво,
знать компилятору какой словарь использовать для сравнения и вывода данных это не криво.
Typed Racket, например, такое легко позволяет (хотя автоматически вывести тип для nub не может):
В Typed Racket есть типы, для которых не определено равенство, если есть то можно продолжать говорить. В данном случае, это тоже самое, что сделать
data F = forall a. (Typeable a,Eq a, Show a) => F a
Решения есть, но для нормального обсуждения все же покажи, как ты собираешься искомые фунции использовать.
Исходная версия qnikst, :
Причина почему это сделать не так просто как ты хочешь: ``` Prelude Data.List> print (nub [] :: [Int]) [] Prelude Data.List> print (nub [] :: [Char]) «» ```
Причины понятны, решение (указать тип списка явно с любым типом элементов, для которого реализован, в данном случае, Eq) тоже.
решение, сделать так, чтобы компилятор мог выбрать словарь или таскать его в рантайме.
Но это как-то криво,
знать компилятору какой словарь использовать для сравнения и вывода данных это не криво.
Typed Racket, например, такое легко позволяет (хотя автоматически вывести тип для nub не может):
В Typed Racket есть типы, для которых не определено равенство, если есть то можно продолжать говорить. В данном случае, это тоже самое, что сделать
data F = forall a. (Typeable a,Eq a, Show a) => F a
Решения есть, но для нормального обсуждения все же покажи, как ты собираешься искомые фунции использовать.