有一个列表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?
答案 0 :(得分:5)
我相信你正在咆哮着错误的树。 length
Data.Set
的定义不以任何方式直接或间接使用Prelude.!!
。 fromList
的定义也没有。我相信列表本身的定义必须以某种方式涉及!!
。检查您的来源,并且不要使用!!
。