gpt4 book ai didi

haskell - 为什么GHCI出错后会得到 "stuck"处于错误状态?

转载 作者:行者123 更新时间:2023-12-03 21:38:45 27 4
gpt4 key购买 nike

首先,我为非描述性标题道歉。因为我不知道实际发生了什么,所以我不能让它更具体。

现在我的问题。我已经为 99 Haskell problems 的问题 23 实现了以下片段,应该随机选择n列表中的项目:

rndSelect' :: RandomGen g => [a] -> Int -> g -> ([a], g)
rndSelect' _ 0 gen = ([], gen)
rndSelect' [] _ _ = error "Number of items requested is larger than list"
rndSelect' xs n gen = ((xs !! i) : rest, gen'')
where (i, gen') = randomR (0, length xs - 1) gen
(rest, gen'') = (rndSelect' (removeAt xs i) (n - 1) gen')

rndSelectIO' :: [a] -> Int -> IO [a]
rndSelectIO' xs n = getStdRandom $ rndSelect' xs n

removeAt :: [a] -> Int -> [a]
removeAt xs n
| length xs <= n || n < 0 = error "Index out of bounds"
| otherwise = let (ys, zs) = splitAt n xs
in ys ++ (tail zs)

现在,当我在 ghci 中加载它时这适用于有效参数:
*Main> rndSelectIO' "asdf" 2 >>= putStrLn 
af

但是,当我使用超出范围的索引时,会发生奇怪的事情:
*Main> rndSelectIO' "asdf" 5 >>= putStrLn
dfas*** Exception: Number of items requested is larger than list
*Main> rndSelectIO' "asdf" 2 >>= putStrLn
*** Exception: Number of items requested is larger than list

如您所见,发生了以下 2 件(对我而言)意想不到的事情:
  • 它不是直接给出错误,而是首先打印输入的排列。
  • 在它给出一次错误之后,它将不再执行。

  • 我怀疑 1. 与惰性评估有关,但我完全不知道为什么 2. 会发生。这里发生了什么?

    最佳答案

    getStdRandom函数基本上是查找 StdGen全局变量中的值,在其上运行一些函数,将新种子放回全局变量中,并将结果返回给调用者。

    如果有问题的函数返回错误,则该错误将被放入全局变量中。现在所有使用这个全局变量的尝试都会抛出一个异常。 (我告诉过你全局变量是邪恶的!;-) )

    尝试调用getStdGen自己手动。它要么打印出当前的随机种子,要么抛出异常。如果它抛出异常......那是你的问题。

    我相信你可以使用setStdGen重置的东西。

    关于haskell - 为什么GHCI出错后会得到 "stuck"处于错误状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30802142/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com