while循环中的错误

Sal*_*Sal 2 haskell loops

我无法弄清楚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])
Run Code Online (Sandbox Code Playgroud)

这依赖于执行main.另一方面,如果我test改为:

test a = while a (\x -> (x!0) < 1) (\x -> U.map (+1) a)
Run Code Online (Sandbox Code Playgroud)

我得到一个结果终止(ghci下面的输出):

?: main
fromList [1]
Run Code Online (Sandbox Code Playgroud)

我觉得我必须遗漏一些东西.我仔细观察了这个功能,但无法弄清楚我做错了什么.看起来谓词不能执行两次以上.

顺便说一句,它适用于其他类型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
Run Code Online (Sandbox Code Playgroud)

ghci输出:

?: main
2
Run Code Online (Sandbox Code Playgroud)

GHC version: 7.6.1

Vector version: 0.10.0.1

sdc*_*vvc 6

test a = while a (\x -> (x!0) < 1) (\x -> U.map (+1) a)
Run Code Online (Sandbox Code Playgroud)

应该

test a = while a (\x -> (x!0) < 1) (\x -> U.map (+1) x)
Run Code Online (Sandbox Code Playgroud)

要么

test a = while a (\x -> (x!0) < 1) (U.map (+1))
Run Code Online (Sandbox Code Playgroud)

否则,您正在迭代的函数将忽略其参数.


你的循环会增加一个计数器,但不会使用它.你可以删除它:

while v p f = go v
      where go x = if p x then go (f x) else x
Run Code Online (Sandbox Code Playgroud)