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)]
我是 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)]