loops - while 循环中的错误

标签 loops haskell

我无法弄清楚我在下面编写的玩具 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]

我觉得我一定错过了什么。我仔细查看了函数,但无法弄清楚我做错了什么。看起来谓词不能执行超过两次。

顺便说一句,它适用于其他类型,如 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 版本:7.6.1

矢量版本:0.10.0.1

最佳答案

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

关于loops - while 循环中的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16993831/

相关文章:

javascript - 除最外层循环外,多个循环都有效

python - “继续” 'for' 循环到前一个元素

list - 为什么 Haskell 列表的 `++` 是递归实现的并且花费 O(n) 时间?

haskell - 如何显示 cabal 项目的依赖关系树

c - 在 C 中从文件中读取时向前看一个字符

python - python 迭代两个数组的快速方法

haskell - 显式类型转换?

haskell - 你将如何在 Haskell 中(重新)实现迭代?

list - 列表的 Haskell 连续子列表

javascript - 数组值替换为对应的id