Haskell - 对列表的前 n 个元素求和

2024-01-08

我是哈斯克尔的新手。

假设我想总结第一个n带有我自己生成的函数的列表元素。我不知道如何用 Haskell 做到这一点。我只知道如何总结整个给定的列表,例如

sumList :: [Int] -> Int
sumList [] = 0
sumList (x:xs) = x + sumList xs

为了总结第一点n列表的元素,例如

采取第一个5数字来自[1..10],即1+2+3+4+5 = 15

我想我可以做这样的事情:

sumList :: Int -> [Int] -> Int
sumList take [] = 0
sumList take (x:xs) = x + take $ sumList xs

但它不起作用...怎么了?


So you know如何对列表中的数字求和,

sumList :: [Int] -> Int
sumList [] = 0
sumList (x:xs) = x + sumList xs

如果该列表中的元素不超过 5 个,并且您确实打算对参数列表中的元素不超过 5 个进行求和,则此函数甚至会返回正确的结果。让我们通过重命名这个函数来明确我们的期望,

sumUpToFiveElements :: [Int] -> Int
sumUpToFiveElements [] = 0
sumUpToFiveElements (x:xs) = x + sumUpToFiveElements xs

对于超过五个的列表,它不会返回正确的结果,但至少名称是正确的。

我们能解决这个问题吗?我们能数到5吗?我们可以一边数到 5,一边像我们一样沿着输入列表前进吗?

sumUpToFiveElements :: Int -> [Int] -> Int
sumUpToFiveElements counter [] = 0
sumUpToFiveElements counter (x:xs) = x + sumUpToFiveElements (counter + 1) xs

当然这仍然是不对的。我们现在确实在计数,但由于某种原因我们忽略了计数器。如果我们想要不超过 5 个元素,什么时候对计数器做出反应合适?咱们试试吧counter == 5:

sumUpToFiveElements :: Int -> [Int] -> Int
sumUpToFiveElements 5       [] = 0
sumUpToFiveElements counter [] = 0
sumUpToFiveElements counter (x:xs) = x + sumUpToFiveElements (counter + 1) xs

但为什么当达到 5 时我们要求列表也为空呢?我们不要这样做:

sumUpToFiveElements :: Int -> [Int] -> Int
sumUpToFiveElements 5       _  = 0        -- the wildcard `_` matches *anything*
sumUpToFiveElements counter [] = 0
sumUpToFiveElements counter (x:xs) = x + sumUpToFiveElements (counter + 1) xs

成功!现在,当达到 5 时我们就停止计数!更多,我们也停止求和!!

等等,但是初始值是多少counter?我们没有指定它,因此我们的函数的用户(即我们自己)很容易犯错误并使用不正确的初始值。顺便说一下,什么is正确的初始值?

好的,让我们这样做:

sumUpToFiveElements :: [Int] -> Int
sumUpToFiveElements xs = go 1 xs     -- is 1 the correct value here?
  where
    go counter  _ | counter == 5 = 0  
    go counter [] = 0
    go counter (x:xs) = x + go (counter + 1) xs

现在,我们不再有那些使我们的定义如此脆弱、如此容易出现用户错误的无关参数。

现在是重点:

概括! (通过用符号值替换示例值;改变5 to n).

sumUpToNElements :: Int -> [Int] -> Int
sumUpToNElements n xs = .......
   ........

Done.


多说一句忠告:不要使用$在你刚开始学习 Haskell 的时候。使用explicit括号。

sumList take (x:xs) = x + take $ sumList xs 

被解析为

sumList take (x:xs) = (x + take) (sumList xs)

这会将两个不相关的数字相加,然后将结果用作要调用的函数(sumList xs)作为参数(换句话说,这是一个错误)。

如果您使用显式括号,您可能不会那样写。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Haskell - 对列表的前 n 个元素求和 的相关文章

  • 为什么在具体化中将 clpfd 变量分配给实际值?

    我正在开发一个 SWI Prolog 程序 该程序使用 CLP FD 约束来找到特定问题的解决方案 为此 我碰巧需要两个列表的 未定位 重叠 那是 List La长度为A List Lb长度为 B A gt B 未定位的重叠列表是La Lb
  • 在列表列表中查找匹配值

    我正在尝试迭代 python 2 7 5 中的列表列表 并返回在第二个列表中找到第一个值的列表 如下所示 python 2 7 5 list1 aa ab bb bc cc list2 aa 1 3 7 de 2 2 1 bc 3 4 4
  • 如何求能被7整除的数字个数?

    给定一个整数N 如何有效地找到范围内能被 7 整除的数字的个数 其逆序也能被 7 整除 0 10 N 1 Example For N 2 回答 4 0 7 70 77 0到99之间所有能被7整除的数字 它们的倒数也能被7整除 我的方法 简单
  • 通过列表搜索

    我一直在尝试定义一个函数 给定一个整数列表和一个整数 n 返回一个布尔值 指示 n 是否在列表中恰好出现一次 我有这个 但它不起作用 我无法弄清楚 once a gt a gt Bool gt Bool filter filter p x
  • Oracle SQL 上的条件 SUM

    我通过以下方式获得数据 ITEM LOCATION UNIT RETAIL QUANTITY 100 KS 10 10 200 KS 20 30 我想要正数量的总和 数量 gt 0 和负数量的总和 数量 如何根据条件获得这些列的总和 您可以
  • 获取数据框列表并按变量分组,然后使用该变量作为字典的键

    我对 python 编程比较陌生 我有一个 pandas 数据框列表 其中都有 年份 列 我试图按该列进行分组并转换为字典 其中字典键是变量 年份 值是该年的数据帧列表 这在Python中可能吗 我试过这个 grouped dict lis
  • 方案语言:合并两个数字

    如何将列表中的两个整数合并为一个 方案中 例子 11 223 gt 11223 假设列表恰好有两个元素 并且都是数字 define merge numbers lst let 1st number gt string first lst 2
  • 如何在 Panda Dataframe 中应用列表理解?

    From a list的值 我尝试识别总和超过 10 的任何连续值对 a 1 9 3 4 5 所以我写了一个for loop values for i in range len a 2 if sum a i i 2 gt 10 values
  • 如何在Python中访问列表列表中的列

    我在 python 中有一个由列表列表建模的二维数组 我想提取该列 我进行了快速研究 找到了一种使用 numpy 数组的方法 问题是我不想使用 numpy所以我不想将列表列表转换为 numpy 数组 然后使用 1 句法 我尝试在正常的列表列
  • 如何在Python中将列表中的整数相加(对数字列表求和)?

    假设我有一个整数列表 例如 2 4 7 12 3 我怎样才能将所有数字加在一起 以获得28 x 2 4 7 12 3 sum of all numbers sum x 或者你可以尝试这个 x 2 4 7 12 3 sum of all nu
  • 不均匀圆盘的最佳覆盖

    What kind of algorithm can I use to search for an optimal minimum area covering of a limited region of the XY plane with
  • MaxLength 数据注释是否可以与 List 一起使用?

    一个可以用 MaxLength 具有字符串和简单数组的属性 i e MaxLength 500 public string ProductName get set Or MaxLength 50 public string Products
  • 边界椭圆约束于水平/垂直轴

    背景 我正在尝试将地形图裁剪成围绕多个风力涡轮机的最小尺寸椭圆 以最小化地图的尺寸 执行此地图裁剪的程序可以裁剪椭圆 但仅限轴沿 x 轴和 y 轴对齐的椭圆 我知道边界椭圆问题的算法 https stackoverflow com ques
  • 如何快速计算集合的所有交集的包含顺序

    这是后续如何在python中快速获取集合的所有交集 https stackoverflow com questions 37622153 我有一个整数有限集合 Ai 的有限集合 A A1 Ak 我想计算Python下列 A 子集的所有交集
  • 如何避免动态图中的“堆指针意大利面条”?

    一般问题 假设您正在编写一个由图组成的系统 以及可以根据相邻节点的配置激活的图重写规则 也就是说 您有一个在运行时不可预测地增长 收缩的动态图 如果你天真地使用malloc 新节点将被分配在内存中的随机位置 经过足够的时间 你的堆将变成一个
  • 从数据框 R 列表中获取列

    我是一个 R 初学者 我被这个问题困扰了 我有一个数据框 并通过使用 split 函数创建了一个数据框列表 例如 dfList lt split mtcars mtcars cyl 现在我想检索特定数据帧的列 例如数据框 1 的第 2 列
  • ? LIKE(列 || '%')

    我可以有这样的条件吗 SELECT FROM table WHERE LIKE column 哪里的 是一个字符串参数值 例如 这些参数值 当列等于时应返回 true admin products admin products 1 admi
  • 理解 Haskell 中的矩阵转置函数

    这个矩阵转置函数有效 但我试图理解它的逐步执行 但我不明白 transpose a gt a transpose transpose x map head x transpose map tail x with transpose 1 2
  • 如何在批处理中返回数组的元素?

    我的程序中的数组列表中有两个元素 如何将变量分配给等于其中一个元素 这是代码 echo off setlocal enabledelayedexpansion set p string for l a in 0 1 1000 do if n
  • python中根据变量类型处理数据子集

    我将以下数据存储在 csv df sample csv 中 我将列名放在名为 cols list 的列表中 df 数据 样本 df data sample pd DataFrame new video BASE SHIVER PREFER

随机推荐

  • Io 语言:异常:对象不响应“URL”

    今天我正在练习 七周七种语言 的 Io 示例 示例代码 futureResult URL with http google com fetch writeln Do something immediately while fetch goe
  • 无法使用 OpenOCD 找到脚本文件

    我正在尝试按照本教程将 OpenOCD 与我的 ST 发现板一起使用 https japaric github io discovery README html https japaric github io discovery READM
  • 使用 dll 的接口安全吗

    当我想导出 DLL 中的类时 从接口派生它并通过导出函数返回该接口是否是正确的方法 exported dll function which is used in the exe function MyClass Create IMyClas
  • 占用 Vaadin Gridlayout 中的可用空间,但考虑换行

    我使用 Vaadin 的 GridLayout 来可视化一些标题和值标签 GridLayout 有 2 列和几行 标题标签位于左侧 其关联的值标签位于右侧 我希望第一列消耗尽可能少的空间 第二列应该占据浏览器窗口的所有重新挖掘空间 如果值标
  • 使用 IF 条件和存储在变量中的比较运算符

    我有一套涉及比较运算符的规则 我想根据规则中存储的比较运算符的值执行一些任务 我正在按照以下方式进行操作 但它不起作用 检查以下代码 if benRules i amountCriteria Greater than comparison
  • XDocument.Save() 时出现内存异常

    我正在尝试将 XDcoument 保存到没有足够可用内存空间的拇指驱动器 这是应用程序的特殊测试条件 虽然应用程序给出了如下所示的异常 但我无法在 XDocument Save filePath 周围的 try catch 块中得到该异常
  • 如何在 AngularJS 中从我的应用程序配置中设置 $httpProvider 默认标头?

    我正在尝试设置我的 httpProvider defaults headers common X CSRF Token cookie auth token 在我的应用程序的 config 部分中 但我似乎还无法访问文档 cookie 有没有
  • 相当于Windows窗体中的canvas

    我正在创建一个简单的应用程序来显示多个图像 一个在另一个下面 在 WPF 中 我使用相当于图像数量的画布数量 并将这些画布添加到主画布中 并使用Image在每个画布上进行控制 我上传了图像 看起来不错 现在 我正在尝试在 Windows 窗
  • PHP连接Hotmail发送邮件?

    目前我正在尝试使用 PHPmailer 发送电子邮件 这是下面的代码
  • 如何在达到一定长度后分割字符串? [复制]

    这个问题在这里已经有答案了 我想在一定长度后分割字符串 假设我们有一串 消息 Who Framed Roger Rabbit 像这样分割 Who Framed Roger Rab bit 我想在 message 变量超过 10 时进行拆分
  • 如何将嵌套字典的所有值转换为字符串?

    我正在编写一个 python 应用程序 其中有一个可以嵌套到任何级别的变量字典 任何级别中的键可以是 int 或 string 但我想将所有级别的所有键和值转换为字符串 字典的嵌套方式是可变的 这使得它有点复杂 col1 0 0 1 8 2
  • “body {background-color}”适用于 HTML,但不适用于 CSS

    能够在内联中设置 HTML 正文的背景颜色属性
  • 如何使这个 C# 循环更快?

    执行摘要 如果您想继续使用 C Reed 下面的答案是最快的 如果您愿意编组到 C 我就是 那么这是一个更快的解决方案 我在 C 中有两个 55mb ushort 数组 我使用以下循环将它们组合起来 float b float number
  • 在mysql中存储金额

    我想将 3 50 存储到 mysql 表中 我有一个浮点数 将其存储在其中 但它存储为 3 5 而不是 3 50 我怎样才能让它有尾随零 不要将货币值存储为浮点数 请使用 DECIMAL 或 NUMERIC 类型 MySQL 数字类型文档
  • 在推送视图中修改列表绑定属性时,SwiftUI 导航会弹出

    当我从向下推 2 层的视图中的数组更新绑定属性时 导航会在属性更改后立即弹出 Xcode 13 3 测试版 iOS 15 我创建了一个简单的演示 代码如下 Shopping Lists List Edit List section Edit
  • 从父类获取子类名

    我的所有活动都有一个基类 ActivityBase 本身源自android app Activity 在 onCreate 中 我想根据当前正在执行的子类执行一些条件逻辑 如果SomeCustomActivity and AnotherCu
  • 如何从常见缩写(PST、EST 等)获取 pytz 时区?

    这是一个类似的问题如何获取 pytz 时区的通用名称 例如 美国 纽约 EST EDT https stackoverflow com questions 5946499 how to get the common name for a p
  • 在 asp:repeater 中,我使用 asp:checkbox,但 OnCheckedChanged 不会触发

    这是代码
  • WinForms 文本框的自定义插入符号

    我正在 WinForms Net 2 0 应用程序中开发一个类似自定义超级终端的应用程序 我在面板中有一个多行文本框 您可以在其中与硬件设备交互 我的客户想要一个自定义插入符 一个大小为一个字符空间的填充矩形 而不是默认的垂直线 我知道 N
  • Haskell - 对列表的前 n 个元素求和

    我是哈斯克尔的新手 假设我想总结第一个n带有我自己生成的函数的列表元素 我不知道如何用 Haskell 做到这一点 我只知道如何总结整个给定的列表 例如 sumList Int gt Int sumList 0 sumList x xs x