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

2023-11-27

我正在为我的 Haskell 课程寻找解决方案。

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

Example:
初始列表:[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 求和的函数:

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]

为了检查您是否理解这些内容,您可以尝试以下一些练习:

  • What do splits and splits'做与[1,2,3,0,4,5]? [1,2,0,3,4,0]? [0]? []?在 ghci 中检查您的预测。
  • 预测四个版本中的每一个的内容groups(包括你的)输入的输出,例如[] or [1,2,0,3,4,0],然后在 ghci 中测试您的预测。
  • Modify groups'''展示其他实现之一的行为。
  • Modify groups''' to use foldl代替foldr.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

拆分列表并从子列表中求和? 的相关文章

随机推荐

  • PHP 可调用对象作为对象成员

    我有课Logger其中 除其他外 还有一个方法Log As Log最常见的用途是Logger例如 我已经有线 invoke打电话Log 另一个类 Site 包含一个成员 Log 它是 Logger 的一个实例 为什么这会起作用 Log th
  • 如何在 jquery 插件中对私有方法进行单元测试?

    也许这是一个有点新手的 JQuery 问题 但是 正确的 jquery 插件是写在闭包内的 因此只有定义插件接口的方法才能从外部访问 有时 或很多时候 人们可能需要辅助方法 而将其作为插件接口的一部分公开是没有意义的 例如 因为它们会改变内
  • 如何从 Go 上的请求正文中获取 JSON

    我是 Go 的新手 但到目前为止我非常喜欢它 我有一个问题我无法弄清楚 我正在将 API 从 Node 迁移到 Go 并且有一个日志 我必须在其中捕获 POST 的正文AS IT IS并将其保存到jsonb在 Postgresql 数据库中
  • Delphi 中嵌入 DB 的全文搜索

    我们正在创建一个开源推特客户端并正在寻找一个嵌入式数据库尽可能最小的占地面积与 Delphi 配合使用并且非常适合全文搜索 我知道这不太适合小足迹 理想情况下 它也应该是免费或开源的 我知道这要求很高 我倾向于SQLite 但我以前没有使用
  • 自定义键盘快捷键

    I want my app to support keyboard shortcuts Many devices such as Asus Transformer have external keyboard which has Ctrl
  • 如何在一张图中绘制多个季节性分解图?

    我正在使用以下提供的季节性分解来分解多个时间序列statsmodels 这是代码和相应的输出 def seasonal decompose item index tmp df2 loc df2 item id copy item ids i
  • 具有多个子句的命名函数的 Elixir 默认参数

    我无法理解默认参数如何与命名函数中的多个子句交互 归根结底 为什么下面的代码片段有效 defmodule Lists do def sum total 0 do total def sum h t total do h sum t tota
  • 在哪里可以获得 UISearchBar 中使用的放大镜图标?

    我在用着UITextField as a UISearchBar替换并 窃取 原始的放大镜图标UISearchBar用这个疯狂的代码 UISearchBar originalSearchBar UISearchBar alloc init
  • 在闪亮的应用程序上安排任务[重复]

    这个问题在这里已经有答案了 我正在使用shiny开发一个应用程序 作为我项目的一部分 我需要每天从网站上抓取一些数据 是否可以使用 cron 或类似实用程序安排每 12 小时完成一项工作 我正在使用免费的闪亮服务器托管服务器 我真的不建议在
  • 使用 Internet Explorer 进行重定向后获取

    我有一个网页实现了发布 重定向 获取模式以避免在简单的 CRUD 应用程序中重复发布 这里预期的请求 响应序列是 浏览器通过以下方式发送数据POST 服务器修改数据库 响应状态302 Moved Temporarily and a Loca
  • 使用 Group By 进行多个运行总计

    我正在努力寻找一种好方法来运行带有 group by 的运行总计 或者类似的方法 下面基于游标的运行总计适用于完整的表 但我想扩展它以添加 客户端 维度 因此 我将在一张表中获得如下创建的运行总计 但对于每个公司 即公司 A 公司 B 公司
  • Zend Framework 布局中的图像

    我在这里有点迷失 解决方案可能潜伏在我的鼻子底下 但我无法得到 想到你们是否有人可以提供帮助 问题是这样的 我有 Zend Framework 标准文件布局 Project application controllers views lay
  • 是否可以使用 JavaScript 读取 Firefox、Safari 和 Chrome 中的剪贴板?

    我正在尝试使用 JavaScript 读取剪贴板的内容 通过 Internet Explorer 可以使用该功能 window clipboardData getData Text 在 Firefox Safari 和 Chrome 中是否
  • 类定义之外的部分模板特化

    我可以在类声明中使用部分模板专业化 template
  • 如何使用javascript检查文件是否被选择?

    在 php 中 这是检查文件是否被选择的方法 FILES item size gt 0 那么在 JavaScript 中呢 我需要知道 因为我有一个只有在选择文件时才起作用的函数 http www w3 org TR DOM Level 2
  • 从逗号分隔的字符串中删除重复项

    是否有更好 更快 的解决方案来从逗号分隔的字符串中删除重复项 public function d dep if strpos dep false nd explode dep oa array unique nd nx count oa g
  • 使用 JDBC 连接到 SQL Server LocalDB

    是否可以使用 JDBC 连接到 SQL Server LocalDB 看起来 截至 2011 年 12 月 这是不可能的 您知道解决方法或状态更改吗 对的 这是可能的 使用 jTDS 的 LocalDB 实例的连接字符串如下所示 jdbc
  • Braintree - paymentMethodNonce 未收到调用

    我已经为 Braintree 设置了 dropin UI 我可以很好地看到用户界面 在此之前 我创建了客户 我可以在 Braintree sandbox 上看到该客户 现在我想向客户添加付款方式 我正在尝试以下代码 但 paymentMet
  • 用于验证文件夹名称和文件名的正则表达式

    我想验证文件名 文件或文件夹的名称不应包含 您能否建议我在 preg match 中使用的正则表达式 Thanks 使用该方法会更有效strpbrk 功能 if strpbrk filename lt gt FALSE filename i
  • 拆分列表并从子列表中求和?

    我正在为我的 Haskell 课程寻找解决方案 我有一个数字列表 我需要为列表的每个部分返回 SUM 部分除以 0 我需要使用 FOLDL 函数 Example 初始列表 1 2 3 0 3 4 0 5 2 1 子列表 1 2 3 3 4