2014-02-19 3 views
0

Я пытаюсь получить разницу между двумя списками, как это:Разница списков с UNKOWN типом данных

[(Char, Char, a)] -> [(Char, Char, a)] -> [(Char, Char, a)] 

где a может быть любого типа. Проблема с выполнением \\ заключается в том, что a не является экземпляром Ord. Есть ли разумное решение? Я попытался сделать сложный материал, где я сначала удалил a, а затем попытался сравнить два списка, но это стало настолько грязным ... Я думаю, это можно сделать с умом map или что-то в этом роде, но я все еще новичок в Haskell, На самом деле это все получилось.

+1

Как вы можете ожидать, чтобы сделать разницу без по крайней мере ограничения 'Eq'? Вы говорите, что хотите посмотреть только на два элемента «Char» и сравнить их с этим? – asm

+0

Вы должны привести нам пример. Существует решение, если вы игнорируете третий компонент при сравнении троек. – ErikR

+0

Да, я хочу проигнорировать третий компонент, извините за неясность! – hboy

ответ

3

Ну для того, чтобы сделать это вам абсолютно необходимо что-то типа

eq :: (Char, Char, a) -> (Char, Char, a) -> Bool 

Если вы не можете сделать это, то нет разумного способа найти разницу. Представьте себе, если я решаю a быть IO(), очевидно, что нет никакого разумного равенства между IO(), так что если вы хотите, чтобы a действительно полиморфный, вы должны проигнорировать его для теста сравнения.

Это довольно легко реализовать

compChars (c1, c2, _) (c1', c2', _) = c1 == c1' && c2 == c2' 

Теперь мы можем общая версия \\ что Data.List обеспечивает, не deleteFirstsBy (понятия не по схеме именования там)

diff = deleteFirstsBy compChars 
Смежные вопросы