我想将一个列表折叠成一个集合,但我的实现似乎要求该列表已经是一个集合。 Element
有一个 Ord
实例。导入正确。
listToSet :: [Element] -> Set Element
listToSet d = foldl' insert empty d
d
在这里应该已经是一个集合,所以这当然会产生类型错误,我可以使用 foldl'
从列表创建一个集合吗?我是否首先需要将 Element
列表“转换”为每个 Element
长度为 1 的集合列表?
错误:
Assignment3.hs:201:39: error:
* Couldn't match type `Element' with `Set Element'
Expected type: [Set Element]
Actual type: [Element]
* In the third argument of foldl', namely `d'
In the expression: foldl' insert empty d
In an equation for `listToSet':
listToSet d = foldl' insert empty d
|
201 | listToSet d = foldl' insert empty d
|
最佳答案
您不小心引用了 Data.Set.foldl'
而不是 Data.List.foldl'
。您需要导入两个模块,然后消除歧义:
listToSet :: [Int] -> Set Int
listToSet d = Data.List.foldl' (flip Data.Set.insert) empty d
更好的是,使用合格的导入:
import qualified Data.Set as S
import Data.List
listToSet :: [Int] -> S.Set Int
listToSet d = foldl' (flip S.insert) S.empty d
或者更好的是,直接使用 S.fromList
:它已经存在于库中,因此没有必要重新发明轮子(除非作为练习)。
关于haskell - 将元素列表折叠为元素集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52792411/