Haskell列出了重复的元素

时间:2012-12-19 20:05:25

标签: list haskell

我正在尝试执行一个函数,告诉我,如果在元组列表中,如果元组的第一个元素在另一个元组中是相同的,则元组的其他元素也必须相等,如果不是,它返回False

main> istup [(1,2,3,4,5),(1,2,3,4,5),(1,4,5,6,2),(4,2,1,5,6)]
>>> False
main> istup [(1,2,3,4,5),(1,2,3,4,5),(4,2,1,5,6),(4,2,1,5,6)]
>>> True

这就是我所拥有的:

type Tuple = (a,b,c,d,e)

istup :: [Tuple] -> Bool
istup x = length (nub x) == length x

2 个答案:

答案 0 :(得分:2)

只需将您的描述写为Haskell代码即可。这些是你的条件:

  • 对于每对元素,您要检查某些条件
  • 您定义条件
  • 你写下“所有配对”的含义:

这是结果代码:

istup :: [(Int,Int,Int,Int,Int)] -> Bool
istup x = all ok (allPairs x)

ok t1 t2 = if fst5 t1 == fst5 t2 then t1 == t2 else True
    where fst5 (a,_,_,_,_) = a

allPairs x = [(a,b) | a <- x , b <- x]

答案 1 :(得分:2)

让我们将任务分成子任务。

1)我们需要将列表拆分为具有相同头部的元组列表,可以使用Data.List.groupBy来完成,它接受一个函数来确定是否将两个项目放在同一个子列表中:

 import Data.List
 import Data.Function (on)
 splitByHead = groupBy ((==) `on` fst5)    -- the function is same as (\a b -> fst5 a == fst5 b)
    where fst5 (a,_,_,_,_) = a

2)然后我们需要检查子列表中的所有项目是否相等(可以查看不同项目列表的长度,这是nub获得的):

 allEqual = (1 == ) . length . nub

3)把它放在一起:

 import Data.List
 import Data.Function (on)

 istup = all ((1 == ) . length . nub) . groupBy ((==) `on` (\(a,_,_,_,_) -> a))