haskell - 将元素列表折叠为元素集合

标签 haskell set

我想将一个列表折叠成一个集合,但我的实现似乎要求该列表已经是一个集合。 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/

相关文章:

Haskell:仅当自上次执行以来经过一定时间后才执行IO操作

data-structures - Haskell 和条件数据结构

python - 从列表中获取唯一元组,Python

algorithm - 从 map 集合中删除另一个 map 中包含的任何 map 的高效算法

按顺序生成列表的所有分区的算法

Haskell 计算满足查询的列表的元素

sql - 在 Haskell/Persistent 中使用没有 ID 列的 SQL 表

c# - 在 C# 中设置和获取

C# 获取设置与不获取设置

haskell - 无法成功安装plot Haskell