In haskell 循环异常在其函数体中没有循环

In haskell loop exception without loop in its function body

我是 Haskell 的新手并编写了以下小代码,但由于循环异常而失败。问题是代码没有使用循环,甚至没有使用递归。 这让我发疯!

gameList :: [Int]->Int->Int->[(Int, Int)]
gameList  org pos step =
    let next  = (mod (pos + step)  2) ;
        pos = next;             
    in  [(pos, pos)]

然后将其保存在一个文件中并成功以交互方式将其加载到GHC中。 像这样调用它 gameList [1,2,3] 0 1

它会抛出错误“[(***异常:<>”

GHCI 信息:WinGHCi 1.0.6 帮帮我!

doesn't use the loop , even recursion

这是不正确的,原因如下。

gameList :: [Int]->Int->Int->[(Int, Int)]
gameList  org pos step =              -- this is an unused argument named pos
  let next  = (mod (pos + step)  2) ; -- here we define next in terms of pos
        pos = next;                   -- ... which is defined here in terms of next
    in  [(pos, pos)]                  -- here we use this circularly-defined pos

看,let 不是赋值,也不是 "executed" 从上到下。 let 引入了一个 相互递归定义块 。所以这个

let next  = (mod (pos + step)  2) ;
    pos = next;             

根本不使用pos函数参数。

"doesn't use a loop, even recursion"

恐怕它确实使用了递归,尽管这种方式在非惰性语言中甚至是不可能的!

关键是你的参数 pos 从未在任何地方实际使用过,它立即被 let 块中定义的 pos 遮蔽(GHC 会警告你这一点, -Wall!)。所以你的代码相当于

gameList org _ step =
    let next  = (mod (pos + step)  2) ;
        pos = next;             
    in  [(pos, pos)]

其中 next 根据 pos 定义,根据 next 定义,即...等等。

明显的解决方法是删除行 pos = next,无论如何这是完全没有必要的。

gameList org pos step
  = let next  = (pos + step) `mod` 2
    in  [(next, next)]