完成Bird& Sons的第一版“功能编程简介”。 Wadler,它使用理论上的惰性语言和Haskell-ish语法。
练习3.2.3问:
使用列表推导,定义用于计算数字的函数 列表中的负数
现在,在这一点上,我们仍然在摸索清单。我认为目的是只使用那时已经引入的概念,并且以下不已被引入:
有哪些工具?
我会承认,我很难过。显然,人们可以通过理解很容易地从原始列表中提取负数,但是如何计算它们,没有长度或索引的概念?
最大函数的可用性表明最终游戏是构造一个列表,其最大元素是负数的数量,函数的最终结果是对所述列表的最大应用。
我要么缺少一些令人眼花缭乱的东西,要么是一个聪明的伎俩,可怕的感觉可能是前者。告诉我,你怎么解决这个问题?
答案 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]])