![](/img/trans.png)
[英]Haskell couldn't match expected type float with actual type 'a'
[英]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]
您還可以利用模式匹配來簡化操作。 如果這樣定義函數,則無需使用head
和tail
:
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
一些事情是“顯而易見的”:
x :: [a]
作為removeElement
的參數。 t
和v
,lambda表達式的類型為t -> v
v
。 但是我們已經說過removeElement :: [a] -> [a]
,那么我們可以拿出t
和v
值來使[a] ~ t -> v
嗎? 也許。 讓我們繼續推斷類型。
t
是aList
的類型,我們可以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.