使用列表推导计算列表中的负数

时间:2014-01-16 15:51:37

标签: functional-programming

完成Bird& Sons的第一版“功能编程简介”。 Wadler,它使用理论上的惰性语言和Haskell-ish语法。

练习3.2.3问:

  

使用列表推导,定义用于计算数字的函数   列表中的负数

现在,在这一点上,我们仍然在摸索清单。我认为目的是只使用那时已经引入的概念,并且以下已被引入:

  • 计算列表长度的功能
  • 列出索引
  • 模式匹配,即f(x:xs)= ...
  • 无限列表
  • 作用于列表的所有函数和运算符 - 除了一个例外 - 例如++,head,tail,map,filter,zip,foldr等

有哪些工具?

  • 返回数字列表的最大元素的最大函数
  • 列表推导,可能有多个生成器表达式和谓词
  • 理解输出不需要依赖于生成器表达式的概念,暗示生成器表达式可用于控制生成列表的大小
  • 有限算术序列表,即[a..b]或[a,a + step..b]

我会承认,我很难过。显然,人们可以通过理解很容易地从原始列表中提取负数,但是如何计算它们,没有长度或索引的概念?

最大函数的可用性表明最终游戏是构造一个列表,其最大元素是负数的数量,函数的最终结果是对所述列表的最大应用。

我要么缺少一些令人眼花缭乱的东西,要么是一个聪明的伎俩,可怕的感觉可能是前者。告诉我,你怎么解决这个问题?

2 个答案:

答案 0 :(得分:7)

第一版的旧版本和非常泛黄的副本附有练习3.2.3的附注:“这个问题需要#(长度),后面只出现”。故事的寓意是在设置练习时要更加小心。我目前正在完成第三版,其中包含每个问题的答案。

顺便问一下,你是否回答了练习1.2.1,它要求你写下所有的方法 正方形(正方形(3 + 7))可以简化为正常形式。事实证明,有547种方式!

答案 1 :(得分:2)

我认为你可能会假设太多限制 - 采用过滤列表的长度对我来说似乎是一个非常明显的解决方案。

有两种选择,但都涉及使用您说未引入的其他功能:

sum [1 | x <- xs, x < 0]

maximum (0:[index | (index, ()) <- zip [1..] [() | x <- xs, x < 0]])