gpt4 book ai didi

haskell - 数组生成中的奇怪 <> 异常

转载 作者:行者123 更新时间:2023-12-04 14:57:29 25 4
gpt4 key购买 nike

我在 Haskell 中遇到了一个无限循环问题,无法理解原因是什么。我在下面有相同代码的三个版本。第一个会导致无限循环,而后两个不会。这是一些用于递归生成数组的基本人为代码。在这种情况下,它只有三个项目,唯一的递归调用是第三个项目,它选择前两个项目中的较大者。 if a > b语句似乎导致了一个循环(但后来我证明它不可能是原因)。

import Data.Array

main :: IO ()
main = print grid
where grid = array (0, 2) $ map func [0 .. 2]
func i
| i == 2 = let a = grid ! (i - 1)
b = grid ! (i - 2)
in if a > b
then (i, a)
else (i, b)
| otherwise = (i, 0)

在下面的版本中,我简单地使用 max a b而不是 if陈述。这里没有循环。

main :: IO ()
main = print grid
where grid = array (0, 2) $ map func [0 .. 2]
func i
| i == 2 = let a = grid ! (i - 1)
b = grid ! (i - 2)
in (i, max a b)
| otherwise = (i, 0)

在以下版本中,我保留了 if但是 zip索引而不是从 func 返回元组.这个也运行良好。

main :: IO ()
main = print grid
where grid = array (0, 2) $ zip [0 .. 2] $ map func [0 .. 2]
func i
| i == 2 = let a = grid ! (i - 1)
b = grid ! (i - 2)
in if a > b
then a
else b
| otherwise = 0

其他两种情况似乎表明递归定义或使用 if 没有问题。陈述。

导致循环的原因是什么?

最佳答案

这是一个有趣的观察:在 (i, max a b) ,我们知道(在计算 ab 之前)这个元组有 i在它的第一个组件中。同样,在您的 zip代码,我们可以观察到元组的第一部分是0 , 1 , 和 2不计算元组的第二部分。然而,在 if a > b then (i, a) else (i, b) ,我们有一个带有 i 的元组并不明显在第一部分:如果 a > b例如是底部,那么这个表达式的结果是底部,而不是 i 的元组在第一部分!

这很重要,因为计算 a > b需要计算 a ,这需要知道哪个值在位置 0在数组中,这需要知道 i0在映射列表的最后一个元素中(因此应该覆盖之前的 0 值)——一个循环。

一种解决方法是解除 (i, _)部分 if,并使用 (i, if a > b then a else b) .这基本上就是您的max解决方案。

关于haskell - 数组生成中的奇怪 <<loop>> 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30090735/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com