0

我正在尝试做一个函数告诉我,如果在元组列表中,如果元组的第一个元素在另一个元组中相同,则元组的其他元素也必须相等,如果不是,它返回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
4

2 回答 2

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]
于 2012-12-19T20:18:28.857 回答
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))
于 2012-12-19T20:27:36.500 回答