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