我无法弄清楚我在下面写的玩具while
循环中的错误是什么。它适用于一个输入,但挂起其他输入。这是代码 - while循环采用向量,向量上的谓词和向量上的变换函数,并返回另一个向量:
import Data.Vector.Unboxed as U
while :: Vector Int -> (Vector Int -> Bool) -> (Vector Int -> Vector Int) -> Vector Int
while v p f = go 0 v
where go n x = if (p x) then go (n+1) (f x)
else x
test :: Vector Int -> Vector Int
test a = while a (\x -> (x!0) < 2) (\x -> U.map (+1) a)
main = print $ test (U.fromList [0])
执行main
时会挂起。另一方面,如果我将test
更改为:
test a = while a (\x -> (x!0) < 1) (\x -> U.map (+1) a)
我终止了结果(ghci
输出如下):
λ: main
fromList [1]
我觉得我必须遗漏一些东西。我仔细观察了这个功能,但无法弄清楚我做错了什么。看起来谓词不能执行两次以上。
BTW,它适用于其他类型,如Int
。
while :: Int -> (Int -> Bool) -> (Int -> Int) -> Int
while i p f = go 0 i
where go n x = if (p x) then go (n+1) (f x)
else x
test :: Int -> Int
test a = while a (\x -> x < 2) (\x -> x+1)
main = print $ test 0
ghci输出:
λ: main
2
GHC version: 7.6.1
Vector version: 0.10.0.1
答案 0 :(得分:6)
test a = while a (\x -> (x!0) < 1) (\x -> U.map (+1) a)
应该是
test a = while a (\x -> (x!0) < 1) (\x -> U.map (+1) x)
或
test a = while a (\x -> (x!0) < 1) (U.map (+1))
否则你迭代的函数会忽略它的参数。
你的循环会增加一个计数器,但不会使用它。你可以删除它:
while v p f = go v
where go x = if p x then go (f x) else x