簡體   English   中英

BST的折疊函數的廣義版本中的參數太多

[英]Too many arguments in generalized version of fold function for BST

運行fold(+)0樣本給我一個關於(+)應用於過多參數的錯誤。 為什么?

data(Ord a, Show a, Read  a) => BST a = Void | Node {
    val :: a,
    left, right :: BST a
} deriving (Eq,  Ord,  Read,  Show)

sample = Node 5 (Node 3 Void Void) (Node 10 Void Void)

fold :: (Read a, Show a, Ord a) => (a -> b -> b ->  b) -> b -> BST a -> b
fold _ z Void         = z
fold f z (Node x l r) = f x (fold f z l) (fold f z r)
 Occurs check: cannot construct the infinite type: a = a -> a Probable cause: `+' is applied to too many arguments In the first argument of `fold'', namely `(+)' In the expression: fold' (+) 0 sample 

另見: fold

你的fold需要一個類型為a -> b -> b -> b的函數作為它的第一個參數,這是一個帶三個參數的函數。 另一方面, (+)只有兩個參數。

是否應該更改fold或者是否需要使用其他函數調用它取決於您實際要執行的操作。

您的問題是您正在將該函數應用於3個參數。 類型簽名中的第一個參數說明了一切。

fold :: (a -> b -> b -> b) -> b -> BST a -> b
fold f z (Node x l r) = f x (fold f z l) (fold f z r)

(+)僅接受2個參數,但是當您傳入它時,它將嘗試對此進行評估:

(+) x (fold (+) z l) (fold (+) z r) -- 3 arguments! =P

您可能想用二進制函數(a-> a-> a)折疊。 假設您要使用(+)。 您希望結果是這樣的:

fold f z (Node x l r) = x + (fold f z l) + (fold f z r)

從那里很容易概括:只需用一個固定的f替換+

fold f z (Node x l r) :: (a -> a -> a) -> a -> BST a -> a
fold f z (Node x l r) = x `f` (fold f z l) `f` (fold f z r)

暫無
暫無

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

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