Haskell 将元素列表折叠成一组元素

Haskell 将元素列表折叠成一组元素,haskell,set,Haskell,Set,我想将列表折叠成一个集合,但我的实现似乎要求列表已经是一个集合元素有一个Ord实例。进口是正确的 listToSet :: [Element] -> Set Element listToSet d = foldl' insert empty d d应该已经是这里的一个集合,所以这当然会给出一个类型错误,我可以使用foldl'从列表中创建一个集合吗?我是否首先需要将元素s列表“强制转换”为一组长度为1的集合,每个元素s 错误: Assignment3.hs:201:39: error:

我想将列表折叠成一个集合,但我的实现似乎要求列表已经是一个集合<代码>元素有一个
Ord
实例。进口是正确的

listToSet :: [Element] -> Set Element
listToSet d = foldl' insert empty d
d
应该已经是这里的一个集合,所以这当然会给出一个类型错误,我可以使用
foldl'
从列表中创建一个集合吗?我是否首先需要将
元素
s列表“强制转换”为一组长度为1的集合,每个
元素
s

错误:

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
:它已经存在于库中,因此没有必要重新设计轮子(除非作为练习)。

的第一个参数是
b->a->b
类型的函数,因此您应该首先提供要更新的
集,然后提供要插入的元素,然后它会生成一个新的
集合

但是,使用相反的方法获取参数:首先使用元素进行插入,然后使用
Set
进行更新

因此,您可以使用“翻转参数”,从而构造一个函数,该函数的参数顺序为
foldl'
可以处理的顺序,因此我们可以定义如下函数:

import Data.Set(empty, insert)
import Data.List(foldl')

listToSet :: (Foldable f, Ord e) => f e -> Set e
listToSet = foldl' (flip insert) empty

请注意,您在这里要定义的内容已经存在:
Data.Set
模块有一个函数,可以从
[a]
中生成
Set a
,可能应该是
foldl'(翻转插入)
为什么不直接使用
数据中的
fromList
函数。Set
模块?@Redu作为练习