使用Set.fromList,得到错误"前奏。!!:索引太大"

时间:2017-09-20 08:19:53

标签: haskell ghc

有一个列表lc

*Main Lib MetaDefinition WHparseCSV WHparseTxT Set> :info lc
lc :: IO [Int]  -- Defined at <interactive>:2:5
*Main Lib MetaDefinition WHparseCSV WHparseTxT Set> length <$> lc
1704399

我想知道这个列表的基数,所以我试着通过这样做将这个列表转换成一个集合:

*Main Lib MetaDefinition WHparseCSV WHparseTxT Set> import Data.Set as Set
*Main Lib MetaDefinition WHparseCSV WHparseTxT Set> let sc = Set.fromList <$> lc 

然而,当我试图计算基数时,我得到了错误:

*Main Lib MetaDefinition WHparseCSV WHparseTxT Set> length <$> sc
*** Exception: Prelude.!!: index too large

sc的类型是正确的:

*Main Lib MetaDefinition WHparseCSV WHparseTxT Set> :info sc
sc :: IO (Set Int)  -- Defined at <interactive>:19:5

我认为length在用于计算fromList :: [Int] -> Set Int类型的值时效果很好

我真的想知道 Exception: Prelude.!!: index too large 的原因。 是因为这个set位于IO monad?

1 个答案:

答案 0 :(得分:5)

我相信你正在咆哮着错误的树。 length Data.Set的定义不以任何方式直接或间接使用Prelude.!!fromList的定义也没有。我相信列表本身的定义必须以某种方式涉及!!。检查您的来源,并且不要使用!!