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>