Öncelikle tanımlayıcı olmayan başlık için özür dilerim. Aslında neler olup bittiğine dair hiçbir fikrim olmadığı için, onu daha spesifik yapamam.GHCI neden bir hatadan sonra "sıkışmış" durumda hata yapıyor?
Sorularım için şimdi.
*Main> rndSelectIO' "asdf" 2 >>= putStrLn
af
: Ben
ghci
bu yüklediğinizde bu geçerli argümanlar için düzgün çalışır Şimdi
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)
: Ben rastgele bir listeden n
öğeler seçmelisiniz 99 Haskell problems, sorunu 23 için şu pasajı uygulamış
*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
Gördüğünüz gibi,: Ben sınırların dışında bir dizin kullandığınızda
Ancak, garip şeyler 2 (benim için) beklenmeyen şeyler gerçekleşir:
- Doğrudan bir hata vermek yerine, önce girişin bir permütasyonunu yazdırın.
- Bir kez bir hata verdikten sonra artık çalışmayacaktır.
1. Bunun tembel değerlendirme ile ilgisi olduğundan şüpheleniyorum, ancak neden 2'nin gerçekleştiğine dair hiçbir fikrim yok. Burada neler oluyor?
Etkileşimli oturumdaki her satır, hiçbir zaman bitmeyen aynı örtük "do" ifadesinin içinde yer alır, böylece her satır bir sonraki sonuca geçer. – chepner