LINUX.ORG.RU

История изменений

Исправление 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

Решения есть, но для нормального обсуждения все же покажи, как ты собираешься искомые фунции использовать.