Haskell-处理列表时出错';s超出自定义atIndex函数的范围

Haskell-处理列表时出错';s超出自定义atIndex函数的范围,haskell,Haskell,我一天前开始学习Haskell,当时我正在尝试做一些例子。我有一个无法解决的问题。 问题是我的if比较不起作用。程序只需重新启动并继续执行else语句。(在代码中注释为注释) 代码: 如你所见。当计数器超过 arr\u大小。谢谢你的帮助 让我们看看这会扩展到什么 atIndex [5, 10, 15, 20, 25] 7 atIndexAcc [5, 10, 15, 20, 25] 7 0 (lengthOf [5, 10, 15, 20, 25]) -- counter is stric

我一天前开始学习Haskell,当时我正在尝试做一些例子。我有一个无法解决的问题。

问题是我的
if
比较不起作用。程序只需重新启动并继续执行
else
语句。(在代码中注释为注释)
代码:

如你所见。当
计数器
超过
arr\u大小
。谢谢你的帮助

让我们看看这会扩展到什么

atIndex [5, 10, 15, 20, 25] 7
atIndexAcc [5, 10, 15, 20, 25] 7 0 (lengthOf [5, 10, 15, 20, 25])
-- counter is strictly evaluated for both index and arr_size checks
-- arr_size is evaluated to perform counter > arr_size check
atIndexAcc [5, 10, 15, 20, 25] 7 0 5
atIndexAcc [10, 15, 20, 25] 7 1 5
atIndexAcc [15, 20, 25] 7 2 5
atIndexAcc [20, 25] 7 3 5
atIndexAcc [25] 7 4 5
atIndexAcc [] 7 5 5
当它停止时-因为
[]
(h:t)
不匹配,所以会得到非穷举模式。您需要一个可以接受空列表的
atIndexAcc
版本。请注意,您比较了
计数器>arr_size
,这也不会发生,因为您在计算时正在遍历列表;只有当列表用尽时,它们才相等


此外,获取列表的长度意味着遍历整个列表;这对于索引它是不必要的,并且将强制整个列表存在于内存中。这不适用于无限列表,这是由于Haskell的惰性计算

让我们看看这会扩展到什么

atIndex [5, 10, 15, 20, 25] 7
atIndexAcc [5, 10, 15, 20, 25] 7 0 (lengthOf [5, 10, 15, 20, 25])
-- counter is strictly evaluated for both index and arr_size checks
-- arr_size is evaluated to perform counter > arr_size check
atIndexAcc [5, 10, 15, 20, 25] 7 0 5
atIndexAcc [10, 15, 20, 25] 7 1 5
atIndexAcc [15, 20, 25] 7 2 5
atIndexAcc [20, 25] 7 3 5
atIndexAcc [25] 7 4 5
atIndexAcc [] 7 5 5
当它停止时-因为
[]
(h:t)
不匹配,所以会得到非穷举模式。您需要一个可以接受空列表的
atIndexAcc
版本。请注意,您比较了
计数器>arr_size
,这也不会发生,因为您在计算时正在遍历列表;只有当列表用尽时,它们才相等


此外,获取列表的长度意味着遍历整个列表;这对于索引它是不必要的,并且将强制整个列表存在于内存中。这不适用于无限列表,这是由于Haskell的惰性计算

您确实在函数中使用了非穷举模式。打开警告(强烈建议!),GHC将告诉您在更多情况下需要定义哪些函数。基本上,它会指出你考虑的情况是代码< >(<:)/代码>(非空列表),但是你忘记了事例<代码> [C]<代码>(空列表)。哦,我刚刚打开警告,它太有用了。非常感谢。您确实在函数中使用了非穷举模式。打开警告(强烈建议!),GHC将告诉您在更多情况下需要定义哪些函数。基本上,它会指出你考虑的情况是代码< >(<:)/代码>(非空列表),但是你忘记了事例<代码> [C]<代码>(空列表)。哦,我刚刚打开警告,它太有用了。非常感谢。
atIndex [5, 10, 15, 20, 25] 7
atIndexAcc [5, 10, 15, 20, 25] 7 0 (lengthOf [5, 10, 15, 20, 25])
-- counter is strictly evaluated for both index and arr_size checks
-- arr_size is evaluated to perform counter > arr_size check
atIndexAcc [5, 10, 15, 20, 25] 7 0 5
atIndexAcc [10, 15, 20, 25] 7 1 5
atIndexAcc [15, 20, 25] 7 2 5
atIndexAcc [20, 25] 7 3 5
atIndexAcc [25] 7 4 5
atIndexAcc [] 7 5 5