晚上好大家!這是一個關于 Haskell 的問題。我想x通過使用函式從串列中獲取隨機元素。
我遇到的問題是,當我嘗試使用亂數時,使用randomRIO. 我收到錯誤訊息:
No instance for (Control.Monad.IO.Class.MonadIO [])
arising from a use of `randomRIO'
當我使用列印或回傳時,此錯誤訊息突然消失。但我不想使用print,并將return輸出弄亂到嵌套串列 [[a]]而不是[a].
你們中有人對我可以做些什么以x串列的形式從串列中提取隨機元素有什么建議嗎?
型別將是這樣的。xRanElems :: [a] -> Int -> [a]
第二個Int是累加器,但我得到了覆寫。
xRanElems xs n = do
r <- randomRIO (0, n)
xRanElems2 xs n r
n剛剛在哪里length xs - 1
xRanElems2 xs n r = (xs !! r) : (xRanElems (xsWithOutSelectedElem xs r) (n-1))
感謝您的任何意見!
uj5u.com熱心網友回復:
以下型別檢查:
import System.Random
xRanElems :: [a] -> Int -> IO [a]
xRanElems xs n = do
-- randomRIO :: Random t
-- => (t, t) -> IO t
r <- randomRIO (0, n) -- r :: Int
xRanElems2 xs n r
xRanElems2 :: [a] -> Int -> Int -> IO [a]
xRanElems2 xs n r =
let (a,b:c) = splitAt r xs
in
fmap (b :) -- [a] -> [a]
(xRanElems -- IO [a] -> IO [a]
(a c) (n-1))
嘗試運行它,例如 with xRanElems [1..3] 2,表明它永遠回圈。
這是因為您需要提供基本情況xRanElems來停止遞回,例如returning []when n <= 0。
上面的代碼還包含一個 off-by-1 錯誤,請您修復。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/436017.html
