Haskell 已排序的随机列表是无限的
Haskell sorted random list is infinite
对于一个小项目,我想使用 Haskell。需要 0 到 9 之间的 4 个随机数批次,完成后需要对这些 [Int]
进行排序(使用:Data.Sort
)。尽管 take 4 xs
,下面的代码仍然返回一个无限列表。
import System.Random
import Data.Sort
randomList :: IO ()
randomList = do
generator <- getStdGen
let rndGen = randomRs (0,9) generator :: [Int]
getFourDigits <- return (fourDigits rndGen)
putStrLn $ show getFourDigits
fourDigits :: Ord a => a -> [a]
fourDigits rndGen = sort $ take 4 (repeat rndGen)
这是stack ghci
中的干运行造成的吗?
简而言之,您的 rndGen
类型为 [Int]
。所以 Int
的列表。因此,这意味着 repeat rndGen
具有类型 [[Int]]
,因此 列表 的 Int
的列表。所有这些列表的大小都是无限的。
这意味着如果你想对该列表进行排序,你需要比较各个元素。但是由于这些单独的元素具有无限大小并且是相等的,所以该函数永远不会终止。如果要判断列表x
是否小于列表y
,可以同时遍历两个列表,从元素不同的那一刻起停止。但是这些元素从来没有什么不同。
您应该将函数实现为:
fourDigits :: Ord a => <b>[</b>a<b>]</b> -> [a]
fourDigits rndGen = sort $ take 4 <b>rndGen</b>
对于一个小项目,我想使用 Haskell。需要 0 到 9 之间的 4 个随机数批次,完成后需要对这些 [Int]
进行排序(使用:Data.Sort
)。尽管 take 4 xs
,下面的代码仍然返回一个无限列表。
import System.Random
import Data.Sort
randomList :: IO ()
randomList = do
generator <- getStdGen
let rndGen = randomRs (0,9) generator :: [Int]
getFourDigits <- return (fourDigits rndGen)
putStrLn $ show getFourDigits
fourDigits :: Ord a => a -> [a]
fourDigits rndGen = sort $ take 4 (repeat rndGen)
这是stack ghci
中的干运行造成的吗?
简而言之,您的 rndGen
类型为 [Int]
。所以 Int
的列表。因此,这意味着 repeat rndGen
具有类型 [[Int]]
,因此 列表 的 Int
的列表。所有这些列表的大小都是无限的。
这意味着如果你想对该列表进行排序,你需要比较各个元素。但是由于这些单独的元素具有无限大小并且是相等的,所以该函数永远不会终止。如果要判断列表x
是否小于列表y
,可以同时遍历两个列表,从元素不同的那一刻起停止。但是这些元素从来没有什么不同。
您应该将函数实现为:
fourDigits :: Ord a => <b>[</b>a<b>]</b> -> [a]
fourDigits rndGen = sort $ take 4 <b>rndGen</b>