从列表中获取特定的三元组

时间:2019-01-16 14:32:37

标签: list haskell

这是Haskell任务: 您有一个元素列表和一个数字。 您必须从列表中找到三元组Just(a,b,c),其中元素a,b和c的总和等于给定的数字。 例子

fun [] 3 -> Nothing
fun [1,2,3,4,5,6] 7 -> Just (1,2,4) 

我试图做这样的事(一开始可能没有)。但是创建分组时有一个错误

createGroups :: [Int] -> [(Int, Int, Int)]
createGroups [] = []
createGroups (x:y:xs) = map ((,,) x y) xs ++ createGroups xs

sum' :: (Int, Int, Int) -> Int
sum' (a,b,c) = a + b + c

filtGr :: [(Int, Int, Int)] -> Int -> (Int, Int, Int)
filtGr [] _ = (0,0,0)
filtGr (x:xs) a = if sum' x == a then x else filtGr xs a 

2 个答案:

答案 0 :(得分:2)

我建议您从编写代码开始,以生成所有可能的三元组。您的createGroups尝试执行此操作,但这是不正确的,因为应用于[1,2,3,...]时将永远不会生成(1,3,something),因为12被一起使用或丢弃了。

我建议改用列表推导,利用tails

createGroups list = 
   [ (x,y,z)
   | (x:xs) <- tails list
   , (y:ys) <- tails xs
   , z      <- ys ]

(如果您不想使用tails,则需要一个更聪明的递归函数,而不是上面的列表理解。)

然后您可以过滤出不等于所需目标数字的三元组。

答案 1 :(得分:0)

我有这样的序列
    subsWithSum :: Int-> [Int]-> [[Int]]     subsWithSum n list =过滤器(\ x-> sum x == n)(过滤器(\ x->长度x == 3)(子序列列表))