【发布时间】:2021-12-10 21:56:42
【问题描述】:
我有以下功能:
longer x y | y < 0 = True
| length x > y = True
| length x <= y = False
其中x 是[a] 类型,y 是Int 类型。
此函数适用于有限列表,但在我输入无限列表时不会计算并进入无限循环。我应该尝试什么其他方法?
我的尝试:
对于longer [1..] 10,我将从第一个值开始,将列表的长度(所以[1])与10进行比较,如果长度更小,则继续前两个值,比较列表的(所以[1,2])长度为10,看到该语句仍然是错误的,继续前三个值等。我认为递归可能是解决我的这个问题的正确方法。
【问题讨论】:
-
提示:如何检查列表的长度是否大于 0?你真的需要
length吗?这如何帮助解决给定的问题? -
length在无限列表上发散,所以你不能使用它。您可以尝试显式模式匹配和递归——这种方法应该是列出练习的默认方法,因为大多数都可以通过这种方式解决。这个任务确实可以这样解决。或者,可以尝试将drop和null组合在一起——两者都可以在无限列表上正常工作。 -
好的开始,但是“然后转到前两个值,将列表的(所以
[1,2])长度与10进行比较”是多余的工作。那时你已经勾选了1,不是吗? -
这几乎是正确的解决方案,只是您需要记住何时弹出了前导
x,这也会影响您要比较的长度。而且,length [x]永远只是1。 -
我认为当
y < 0时,我更希望这个函数返回True而不是错误。毕竟,每个列表的长度肯定比任何负数都大!
标签: haskell infinite-loop