【发布时间】:2019-12-16 10:17:24
【问题描述】:
我正在尝试使用随机数对任何 a 的列表进行洗牌。我在这里问这个的原因是因为我已经制作了一个函数,但我无法弄清楚它到底为什么不起作用。
pick :: [a] -> IO a
pick xs = do
n <- randomRIO (0, length xs - 1)
return $ xs !! n
shuffle :: [a] -> [IO a]
shuffle ls = do
x <- pick ls
let y = remove x ls
(return x) : shuffle y
-- Remove an element from a list (Only first appearance)
remove :: (Eq a) => a -> [a] -> [a]
remove _ [] = []
remove r (x:xs) = if x == r then xs else x : remove r xs
我得到的错误:
num.hs:31:10: error:
* Couldn't match type `IO' with `[]'
Expected type: [a]
Actual type: IO a
* In a stmt of a 'do' block: x <- pick ls
In the expression:
do x <- pick ls
let y = remove x ls
(return x) : shuffle y
In an equation for `shuffle':
shuffle ls
= do x <- pick ls
let y = ...
(return x) : shuffle y
|
31 | x <- pick ls
| ^^^^^^^
对我来说没有意义的是它说它收到了类型 [a] 而不是 IO a 来选择,但 ls 被定义为 [a]?
如果这有什么根本性的问题,我只是不明白,有没有另一种方法可以在 Haskell 中这样简单地打乱列表?最好没有任何进口。
【问题讨论】:
-
我认为你的函数类型应该是
[a] -> IO [a],而不是[a] -> [IO a]。 -
@WillemVanOnsem 我试过了,但出现了两个新错误 - 太大,无法在此处发布
标签: list haskell random functional-programming shuffle