簡體   English   中英

如何在Haskell類型構造函數中定義參數的類型?

[英]How to define the types of parameters in a Haskell type constructor?

首先想象一下樹的標准構造:

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)

但是,如果嘗試使用此代碼,則會出現以下錯誤:

無法推斷出源自文字“ 1”的(數字計數)

為了解決這個問題,我將函數的類型聲明更改為:

tree_insert :: (Ord k, Num count) => k -> Tree k count -> Tree k count

但是,沿線我遇到了進一步的問題。 在我看來,Haskell似乎在告訴我,沒有Num count ,它不知道它是什么類型,因此當我在第一個模式中將其分配為1時,它將產生錯誤。 Num count確實似乎不是解決問題的好方法。 理想情況下,在進行初始類型聲明時,我應該能夠定義什么類型計數:

data Tree k count = Leaf | Node k count (Tree k count) (Tree k count)
where count is Int

顯然,上面的代碼不好,但是只是我正在考慮的一種示例。

如果我想要的是可能的,或者如果還有其他方法可以解決此問題,則不太理想,我很想聽聽。 重點在於數據類型和函數以及所有類型的定義,而不僅僅是這個特定問題。

謝謝!

這里有兩種選擇。 更直接的是不對Tree類型進行參數化count

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM