簡體   English   中英

Haskell:無法將預期類型與實際類型匹配

[英]Haskell: Couldn't match expected type with actual type

嘿,所以我在課堂上學習Haskell,但遇到了從列表中刪除所有內容的問題。 這是我的努力,但是我遇到了不確定並不確定的錯誤。

--delete element from list 
removeElement :: [a] -> [a]
removeElement x [] = []
removeElement x aList =
    if (head aList) == x
        then removeElement x (tail aList)
        else aList

我收到的錯誤是這樣的:

Couldn't match expected type `[[a]] -> [[a]]'
                with actual type `[a]'
    Relevant bindings include
      removeElement :: [a] -> [a] (bound at hwmk3.hs:8:1)
    The equation(s) for `removeElement' have two arguments,
    but its type `[a] -> [a]' has only one

我猜想語法是錯誤的,但是我不確定如何修復它。 謝謝你的幫助。

一些東西:

類型注釋表示您的函數將接收一個列表參數並返回一個列表,而實現表示您應接收兩個參數,第一個參數是單個元素。

此外,由於要使用==進行比較,因此需要確保您的類型屬於Eq類型類。

您的類型注釋應該看起來像這樣:

removeElement :: Eq a => a -> [a] -> [a]

您還可以利用模式匹配來簡化操作。 如果這樣定義函數,則無需使用headtail

removeElement x aList@(y:ys) =
  if y == x
    then removeElement x ys
    else aList

但是 ,條件語句中存在邏輯錯誤。 由於這聽起來像作業,所以我將其留給您以找到答案。 提示,請嘗試removeElement 3 [1, 2, 3]

如果您省略了函數的顯式類型聲明,Haskell將推斷出類似a -> [a] -> [a] 實際上,它仍然可以推斷出這一點,這就是為什么它抱怨它與您聲明的類型不一致。

Haskell報告的問題是此。 查看您的第二個等式,

removeElement x = \aList -> if (head aList) == x then removeElement x (tail aList) else aList

一些事情是“顯而易見的”:

  1. x :: [a]作為removeElement的參數。
  2. 對於某些類型tv ,lambda表達式的類型為t -> v v

但是我們已經說過removeElement :: [a] -> [a] ,那么我們可以拿出tv值來使[a] ~ t -> v嗎? 也許。 讓我們繼續推斷類型。

taList的類型,我們可以head aList == x推斷為[[a]] 現在跳過遞歸調用,我們還可以看到aList是返回值,因此v也是[[a]] 因此, t -> v實際上是[[a]] -> [[a]]

我們可以匹配類型的值[[a]] -> [[a]][a]

不,這就是為什么您得到確切的錯誤消息的原因。

您的類型簽名應為

removeElement :: a -> [a] -> [a]

同樣,您的函數似乎沒有執行您認為會做的事情。

暫無
暫無

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

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