2017-09-20 7 views
0

Il y a une liste lcutilisation Set.fromList, obtenir erreur « Prelude !!:. Index trop grand »

*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 

Je voudrais savoir la cardinalité de cette liste, j'ai donc essayé de convertir cette liste à un ensemble en faisant:

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

cependant, quand je suis en train de calculer la cardinalité, je suis l'erreur:

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

le type de sc est correct:

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

et je pense que length fonctionne bien quand ils sont utilisés pour calculer la valeur du type fromList :: [Int] -> Set Int

Je voudrais vraiment savoir ce qui cause cette Exception: Prelude.!!: index too large. est-ce parce que ce set est dans la monade IO?

+0

La cardinalité d'un ['Data.Set'] (http://hackage.haskell.org/package/containers-0.5.10.2/docs/Data-Set.html#size) est calculée par' size' non par «longueur». – Cirquit

+0

@Cirquit, 'longueur' devrait fonctionner aussi bien. – dfeuer

Répondre

5

Je crois que vous aboyez le mauvais arbre. La définition de length pour Data.Set n'utilise pas Prelude.!! de quelque manière que ce soit, directement ou indirectement. La définition de fromList ne l'est pas non plus. Je crois que la définition de la liste elle-même doit impliquer !! d'une certaine manière. Vérifiez votre source et n'utilisez pas !!.