gpt4 book ai didi

haskell - Set 类型类在哪里?

转载 作者:行者123 更新时间:2023-12-04 16:31:05 26 4
gpt4 key购买 nike

在 Haskell 中 Data.Set 实现一个具体的集合类型。正常 []列表还实现了集合的所有操作(在 Data.List 中)。但是好像没有预定义Set他们都实现的类型类。你可以自己实现一个:

{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances, FunctionalDependencies #-}

module Set where

import qualified Data.List as ConcreteList
import qualified Data.Set as ConcreteSet

class Set set a | set -> a where
empty :: set
singleton :: a -> set
insert :: a -> set -> set
delete :: a -> set -> set
union :: set -> set -> set
intersection :: set -> set -> set
member :: a -> set -> Bool
filter :: (a -> Bool) -> set -> set

instance (Ord a) => Set (ConcreteSet.Set a) a where
empty = ConcreteSet.empty
singleton = ConcreteSet.singleton
insert = ConcreteSet.insert
delete = ConcreteSet.delete
union = ConcreteSet.union
intersection = ConcreteSet.intersection
member = ConcreteSet.member
filter = ConcreteSet.filter

instance (Eq a) => Set [a] a where
empty = []
singleton e = [e]
insert = (:)
delete = ConcreteList.delete
union = ConcreteList.union
intersection = ConcreteList.intersect
member = ConcreteList.elem
filter = ConcreteList.filter

但如果这是要走的路,这似乎已经完成了。所以我的问题是: Set 在哪里? typeclass 或 Haskell 社区提出了什么替代解决方案?

诚然,我的问题与 Why is Haskell missing “obvious” Typeclasses 非常相似。 ,但通过更具体(关注具有示例实现的特定示例),我也希望得到一些更具体的答案。

最佳答案

无论出于何种原因,Haskell 都倾向于不做具有深层类型类层次结构来表示所有可能类型的容器的全部事情。

通常,不同种类的容器具有针对不同操作的性能属性。通常,您知道哪些操作对您很重要,您可以选择最合适的容器并明确使用它。没有太多要求能够编写真正通用的代码,以在每种可能的容器类型上运行。

请注意,已经有一些用于处理容器的类型类——它们可能不是您所期望的。例如:

  • Functor允许您将函数应用于容器的每个元素——任何容器——并将结果收集到相同类型的新容器中。
  • Applicative和/或 Monad允许您将函数应用于每个元素并产生多个元素作为结果。 (可能不明显,但您可以使用它来执行“过滤”甚至“删除”,尽管它可能效率不高。)
  • Monoid提供您的 emptyunion方法(但命名为 memptymappend )。
  • Alternative , FoldableTraversable让你做更有趣的魔术。
  • 关于haskell - Set 类型类在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34790721/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com