簡體   English   中英

無法將預期類型“[Int]”與實際類型“Int”相匹配 haskell

[英]Couldn't match expected type ‘[Int]’ with actual type ‘Int’ haskell

我正在嘗試做一個練習,給出一個二叉樹從葉到根的每條路徑的列表

這是我的代碼:

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

go (Leaf a) = (a : []) : []
go (Node l n r) = insev((go l):(go r)) n

insev :: [[a]] -> a -> [[a]]
insev [[]] x = []
insev (h:t) x = (insb h x) : (insev t x)

insb [] num = num : []
insb (h:t) num = h:(insb t num)

從邏輯的角度來看它應該是正確的,但我是 haskell 的新手,我不知道為什么會出現此錯誤

Main.hs:21:19: error:
    • Couldn't match type ‘[Int]’ with ‘Int’
      Expected: [[Int]]
        Actual: [[[Int]]]
    • In the expression: insev ((go l) : (go r)) n
      In an equation for ‘go’:
          go (Node l n r) = insev ((go l) : (go r)) n
   |
21 | go (Node l n r) = insev ((go l):(go r)) n
   |                   ^^^^^^^^^^^^^^^^^^^^^^^

Main.hs:21:34: error:
    • Couldn't match type ‘Int’ with ‘[Int]’
      Expected: [[[Int]]]
        Actual: [[Int]]
    • In the second argument of ‘(:)’, namely ‘(go r)’
      In the first argument of ‘insev’, namely ‘((go l) : (go r))’
      In the expression: insev ((go l) : (go r)) n
   |
21 | go (Node l n r) = insev ((go l):(go r)) n
   |                                  ^^^^

Main.hs:21:41: error:
    • Couldn't match expected type ‘[Int]’ with actual type ‘Int’
    • In the second argument of ‘insev’, namely ‘n’
      In the expression: insev ((go l) : (go r)) n
      In an equation for ‘go’:
          go (Node l n r) = insev ((go l) : (go r)) n
   |
21 | go (Node l n r) = insev ((go l):(go r)) n

甚至不看代碼的rest ,這永遠不會飛:

(go l) : (go r)

大概go在兩個調用中返回相同類型的東西,但是 arguments 到(:)必須有不同的類型:

(:) :: a -> [a] -> [a]

也許你想要(++)而不是,它的 arguments 必須具有相同的類型:

(++) :: [a] -> [a] -> [a]

*好的,是的, go的編寫方式可能會使下一句假設它在兩次調用中返回相同類型的假設無效。 但這是一種非常不尋常的情況,你必須非常有意識地嘗試達到這種情況。

暫無
暫無

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

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