Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell Ord实例与一个集合_Haskell_Set - Fatal编程技术网

Haskell Ord实例与一个集合

Haskell Ord实例与一个集合,haskell,set,Haskell,Set,我想使用一些代码将边缘附加到节点数据结构: import Data.Set (Set) import qualified Data.Set as Set data Node = Vertex String (Set Node) deriving Show addEdge :: Node -> Node -> Node addEdge (Vertex name neighbors) destination | Set.null neighbors = Vert

我想使用一些代码将边缘附加到节点数据结构:

import Data.Set (Set)
import qualified Data.Set as Set

data Node = Vertex String (Set Node)
    deriving Show

addEdge :: Node -> Node -> Node
addEdge (Vertex name neighbors) destination
    | Set.null neighbors    = Vertex name (Set.singleton destination)
    | otherwise             = Vertex name (Set.insert destination neighbors)
但是,当我尝试编译时,会出现以下错误:

No instance for (Ord Node)
      arising from a use of `Set.insert'

据我所知,Set.insert只需要一个值和一个要插入的集合。这是什么Ord?

Haskell集合基于搜索树。为了将元素放入搜索树中,必须给出元素的排序。通过将Ord添加到数据声明中,您可以像导出Show一样导出Ord,即:

data Node = Vertex String (Set Node)
   deriving (Show, Eq, Ord)
您可以通过Data.Set.insert的签名查看Ord的要求

(Ord a) => a -> Set a -> Set a

Ord a=>部分建立了一个约束,即a有一个类型类Ord的实例。中的提供了更全面的解释。

Haskell集合基于搜索树。为了将元素放入搜索树中,必须给出元素的排序。通过将Ord添加到数据声明中,您可以像导出Show一样导出Ord,即:

data Node = Vertex String (Set Node)
   deriving (Show, Eq, Ord)
您可以通过Data.Set.insert的签名查看Ord的要求

(Ord a) => a -> Set a -> Set a
Ord a=>部分建立了一个约束,即a有一个类型类Ord的实例。中的提供了更全面的解释。

在GHCi中:

> import Data.Set
> :t insert
insert :: (Ord a) => a -> Set a -> Set a
所以,是的,它确实期望Ord。至于Ord的意思,它是一个有序值的类型类。在这种情况下,这是必需的,因为Data.Set使用搜索树,因此需要能够比较值,以查看哪个值更大,或者它们是否相等

几乎所有的标准内置数据类型都是Ord的实例,列表、元组、Maybe等都是Ord的实例,当它们的类型参数为。当然,最显著的例外是函数,在函数中,没有合理的排序甚至相等的概念可以定义

在许多情况下,您可以在声明后使用派生子句为自己的数据类型自动创建类型类的实例:

data Foo a = Foo a a Int deriving (Eq, Ord, Show, Read)
对于参数化类型,自动派生依赖于类型参数也是一个实例,列表、元组等也是如此

除了Ord,一些重要的类型类是Eq相等比较,但不小于/大于枚举类型,您可以枚举其值,例如计数整数,以及使用字符串读取/显示简单序列化/反序列化。要了解有关类型类的更多信息,请尝试,或者,要了解更全面的概述,请参阅GHCi中的。

> import Data.Set
> :t insert
insert :: (Ord a) => a -> Set a -> Set a
所以,是的,它确实期望Ord。至于Ord的意思,它是一个有序值的类型类。在这种情况下,这是必需的,因为Data.Set使用搜索树,因此需要能够比较值,以查看哪个值更大,或者它们是否相等

几乎所有的标准内置数据类型都是Ord的实例,列表、元组、Maybe等都是Ord的实例,当它们的类型参数为。当然,最显著的例外是函数,在函数中,没有合理的排序甚至相等的概念可以定义

在许多情况下,您可以在声明后使用派生子句为自己的数据类型自动创建类型类的实例:

data Foo a = Foo a a Int deriving (Eq, Ord, Show, Read)
对于参数化类型,自动派生依赖于类型参数也是一个实例,列表、元组等也是如此


除了Ord,一些重要的类型类是Eq相等比较,但不小于/大于枚举类型,您可以枚举其值,例如计数整数,以及使用字符串读取/显示简单序列化/反序列化。要了解有关类型类的更多信息,请尝试,或者,为了获得更全面的概述,必须将派生语句括起来。

是的,这似乎是可行的。谢谢。派生语句必须插入括号,但是是的,这似乎有效。非常感谢。