Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.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
Function 如何在Haskell类型构造函数中定义参数类型?_Function_Haskell_Types - Fatal编程技术网

Function 如何在Haskell类型构造函数中定义参数类型?

Function 如何在Haskell类型构造函数中定义参数类型?,function,haskell,types,Function,Haskell,Types,首先想象一棵树的标准构造: data Tree k = Leaf | Node k (Tree k) (Tree k) 我想实现一个版本,通过计算重复条目来处理重复条目,所以我有如下类型: data Tree k count = Leaf | Node k count (Tree k count) (Tree k count) 因此,我的代码是: tree_insert :: Ord k => k -> Tree k count -> Tree k count tree

首先想象一棵树的标准构造:

data Tree k = Leaf | Node k (Tree k) (Tree k) 
我想实现一个版本,通过计算重复条目来处理重复条目,所以我有如下类型:

data Tree k count = Leaf | Node k count (Tree k count) (Tree k count) 
因此,我的代码是:

tree_insert :: Ord k => k -> Tree k count -> Tree k count
tree_insert k Leaf = Node k 1 Leaf Leaf
tree_insert k (Node n count l r)
    | k == n = Node n (count+1) l r
    | k < n  = Node n count (tree_insert k l) r
    | k > n  = Node n count l (tree_insert k r)
然而,接下来我遇到了更多的问题。在我看来,Haskell似乎在告诉我,如果没有
Num count
,它不知道它是什么类型,因此当我在第一个模式中将它指定为1时,它会产生错误。
Num count
似乎不是解决问题的好方法。理想情况下,我应该能够在进行初始类型声明时定义类型计数,例如:

data Tree k count = Leaf | Node k count (Tree k count) (Tree k count)
where count is Int
显然,上面的代码不好,但这是我想到的一个例子

如果我想要的是可能的,或者不太理想的话,如果有另一种方法来解决这个问题,我很乐意听到。重点是定义数据类型和函数以及所有内容,而不仅仅是这个特定问题


谢谢

这里有两种选择。更简单的方法是不在
类型上参数化
计数

data Tree k = Leaf | Node k Int (Tree k) (Tree k)

tree_insert :: Ord k => k -> Tree k -> Tree k
tree_insert ...
或者,如果您设想自己有时需要更通用的树类型,您可以坚持使用synonyn类型

data Tree k count = Leaf | Node k count (Tree k count) (Tree k count)
type TreeInt k = Tree k Int

tree_insert :: Ord k => k -> TreeInt k -> TreeInt k
tree_insert ...

这里有两种选择。更简单的方法是不在
类型上参数化
计数

data Tree k = Leaf | Node k Int (Tree k) (Tree k)

tree_insert :: Ord k => k -> Tree k -> Tree k
tree_insert ...
或者,如果您设想自己有时需要更通用的树类型,您可以坚持使用synonyn类型

data Tree k count = Leaf | Node k count (Tree k count) (Tree k count)
type TreeInt k = Tree k Int

tree_insert :: Ord k => k -> TreeInt k -> TreeInt k
tree_insert ...

原始树类型在每个节点存储的数据类型中已经完全参数化;您可以使用存储
(k,Int)
值的树,而不仅仅是
k

data Tree k = Leaf | Node k (Tree k) (Tree k)

tree_insert :: a -> Tree (a, Int) -> Tree (a, Int)
tree_insert k Leaf = Node (k, 1) Leaf Leaf
tree_insert k (Node (n, count) l r)
  | k == n = Node (n, count+1) l r
  | k < n  = Node (n, count) (tree_insert k l) r
  | k > n  = Node (n, count) l (tree_insert k r)
数据树k=Leaf |节点k(树k)(树k)
树插入::a->tree(a,Int)->tree(a,Int)
树\插入k叶=节点(k,1)叶
树插入k(节点(n,计数)lr)
|k==n=Node(n,count+1)lr
|kn=节点(n,计数)l(树插入kr)

在每个节点存储的数据类型中,原始树类型已经完全参数化;您可以使用存储
(k,Int)
值的树,而不仅仅是
k

data Tree k = Leaf | Node k (Tree k) (Tree k)

tree_insert :: a -> Tree (a, Int) -> Tree (a, Int)
tree_insert k Leaf = Node (k, 1) Leaf Leaf
tree_insert k (Node (n, count) l r)
  | k == n = Node (n, count+1) l r
  | k < n  = Node (n, count) (tree_insert k l) r
  | k > n  = Node (n, count) l (tree_insert k r)
数据树k=Leaf |节点k(树k)(树k)
树插入::a->tree(a,Int)->tree(a,Int)
树\插入k叶=节点(k,1)叶
树插入k(节点(n,计数)lr)
|k==n=Node(n,count+1)lr
|kn=节点(n,计数)l(树插入kr)

如果您总是希望
count
Int
,可以在
树中定义它:
数据树k=Leaf |节点k Int(树k Int)(树k Int)
。你的函数不需要更改,只需要签名。真棒的朋友,这完全成功了。我必须从我的函数签名以及类型的初始声明中的
树k count
中去掉
count
部分,就像你说的那样!把它放在一个答案中,我会把它标记为正确:)“Num count看起来确实不是解决问题的好方法”-这是Haskell解决问题的方法。@user2407038 Num count不够具体。就我而言,Haskell是关于严格类型的,所以如果我知道它总是Int,那么我想把它定义为Int。如果你总是希望
count
Int
,你可以在
Tree
中定义它:
数据树k=Leaf |节点k Int(Tree k Int)(Tree k Int)
。你的函数不需要更改,只需要签名。真棒的朋友,这完全成功了。我必须从我的函数签名以及类型的初始声明中的
树k count
中去掉
count
部分,就像你说的那样!把它放在一个答案中,我会把它标记为正确:)“Num count看起来确实不是解决问题的好方法”-这是Haskell解决问题的方法。@user2407038 Num count不够具体。就我而言,Haskell是关于严格类型的,所以如果我知道它总是Int,那么我想将它定义为Int。这也是一种很棒的方法,也是一种很棒的方法。谢谢这也很棒,是另一种很棒的方式。谢谢