[英]Haskell: Couldn't match expected type '[a0]' with actual type '([char], [int])'
[英]Haskell Programming Assignment, “Couldn't match expected type ‘Int’ with actual type ‘[a0] -> Int’ ”and a few more Errors
我有以下分配:具有一個值和一個列表的函數numOccurences,返回該值出現在列表中的次數。 我正在學習haskell並感到沮喪,這是我的代碼:
numOccurences:: b -> [a] -> Int
numOccurences n [ls]
|([ls] !! n==True) = (numOccurences(n (tail [ls])))+1
|otherwise = 0
我收到的錯誤如下: https : //imgur.com/a/0lTBn
一些提示:
首先,在類型簽名中,使用不同的類型變量(即b
和a
)可能會導致您在另一種類型的列表中查找某一種類型的值的出現,在這種情況下,這不是您想要的。 因此,您只想使用一個而不是兩個類型變量。
其次,無論列表的具體類型是什么,無論是[Char]
, [Int]
等,它都必須是相等的(即,需要派生Eq
類型類),因此使用類約束是有意義的(Eq a) =>
在您的類型簽名中。
第三,由於我們遍歷一個列表,因此我們使用模式匹配來安全地斷開該列表的第一個元素以進行比較,並且我們還添加了一個基本案例(即我們對空列表的處理),因為我們正在使用遞歸,並且只要列表中有元素,我們就只希望遞歸模式匹配。
最后,請嘗試避免使用索引編制(即!!
),在這種情況下可以避免索引編制,而應使用模式匹配,因為這樣做更安全,更容易推理。
根據上述指針,這是修改后的函數的外觀:
numOccurences :: (Eq a) => a -> [a] -> Int
numOccurences _ [] = 0
numOccurences n (x:xs)
| n == x = 1 + numOccurences n xs
| otherwise = numOccurences n xs
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.