2014-02-19 51 views
0

差异列表,我试图让两个列表之间的区别是这样的:与未知的数据类型

[(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 

的东西,如果你不能做到这一点,那么就找差不理智的方式。想象一下,如果我决定aIO(),显然IO()之间没有理智的平等,所以如果你想保持a真正的多态性,你必须忽略它的比较测试。

这是很容易实现

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

现在我们可以的\\普通版本Data.List提供,deleteFirstsBy(在命名方案有没有线索)

diff = deleteFirstsBy compChars