gpt4 book ai didi

haskell - 拆分列表并从子列表中求和?

转载 作者:行者123 更新时间:2023-12-03 14:24:20 25 4
gpt4 key购买 nike

我正在为我的 Haskell 类(class)寻找解决方案。

我有一个数字列表,我需要为列表的每个部分返回 SUM。零件除以 0。我需要使用 FOLDL 功能。

例子:
初始列表:[1,2,3,0,3,4,0,5,2,1]
子列表 [[1,2,3],[3,4],[5,2,1]]
结果 [6,7,7]

我有一个在初始列表中查找 0 的函数:

findPos list = [index+1 | (index, e) <- zip [0..] list, e == 0] 

(示例中的初始列表返回 [4,6])

和使用 FOLDL 进行 SUM 的函数:
sumList list = foldl (+) 0 list

但我完全没有把它放在一起:/

---- 我的解决方案
最后我发现了你们建议的完全不同的东西。
我花了一整天才完成:/
groups :: [Int] -> [Int]
groups list = [sum x | x <- makelist list]

makelist :: [Int] -> [[Int]]
makelist xs = reverse (foldl (\acc x -> zero x acc) [[]] xs)

zero :: Int -> [[Int]] -> [[Int]]
zero x acc | x == 0 = addnewtolist acc
| otherwise = addtolist x acc

addtolist :: Int -> [[Int]] -> [[Int]]
addtolist i listlist = (i : (head listlist)) : (drop 1 listlist)

addnewtolist :: [[Int]] -> [[Int]]
addnewtolist listlist = [] : listlist

最佳答案

我会给你一些提示,而不是一个完整的解决方案,因为这听起来像是一个家庭作业。

我喜欢你建议的步骤分解。对于第一步(从带有零标记的数字列表到列表列表),我建议进行显式递归;试试这个模板:

splits []     = {- ... -}
splits (0:xs) = {- ... -}
splits (x:xs) = {- ... -}

您也可以滥用 groupBy 如果你小心。

第二步,看起来你就快到了;您需要的最后一步是查看 map :: (a -> b) -> ([a] -> [b]) 函数,它接受一个普通函数并在列表的每个元素上运行它。

作为额外的练习,您可能想考虑如何在一次折叠中完成整件事。如果您跟踪 foldr 的各种参数的类型,这是可能的,甚至不会太难。/ foldl必须是!

问题改变后的补充:

由于您似乎已经找到了解决方案,因此我现在可以轻松地进行一些剧透。 =)

我提出了两种可能的实现方式;一个按照您的建议逐步进行,而另一个则同时进行。一步一步的可能是这样的:
splits []     = []
splits (0:xs) = [] : splits xs
splits (x:xs) = case splits xs of
[] -> [[x]]
(ys:yss) -> ((x:ys):yss)

groups' = map sum . splits

或者像这样:
splits' = groupBy (\x y -> y /= 0)
groups'' = map sum . splits'

一次性版本可能如下所示:
accumulate 0 xs     = 0:xs
accumulate n (x:xs) = (n+x):xs

groups''' = foldr accumulate [0]

为了检查你是否理解这些,这里有一些你可能想尝试的练习:
  • 做什么splitssplits'[1,2,3,0,4,5] ? [1,2,0,3,4,0] ? [0] ? [] ?在 ghci 中检查您的预测。
  • 预测groups的四个版本分别是什么(包括您的)输入的输出,如 [][1,2,0,3,4,0] ,然后在 ghci 中测试您的预测。
  • 修改 groups'''展示其他实现之一的行为。
  • 修改 groups'''使用 foldl而不是 foldr .
  • 关于haskell - 拆分列表并从子列表中求和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9775072/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com