所以,儘管我認爲「原始」的方法你提到可能是一個更好的主意,讓我們先得到你的模式匹配錯誤的方式進行:
look :: Database -> BarCode -> BillItem
look [] y = ("Unknown Item", 0)
look ((a,b,c):xs) y
| y == a = (b,c)
| otherwise = ("Unknown Item", 0)
也就是說,當你說(a,b,c:xs)
,你所說的和(a,b,(c:xs))
一樣。你不想那樣,所以你需要(a,b,c)
左右的人。現在,一旦解決了問題,它就會編譯!
但是等一下,它會返回("Unknown Item", 0)
除了數據庫中的第一件事外。就好像你已經告訴它只看第一件事,如果不匹配,就返回一個錯誤。
哦,等等,你有。在你的代碼中,它說:「如果你有一個非空的數據庫,檢查它是否匹配第一個項目並返回它,否則返回一個錯誤。」
所以我們來解決這個問題。如果第一個項目不匹配,則應嘗試數據庫的其餘部分,而不返回錯誤值。
look :: Database -> BarCode -> BillItem
look [] _ = ("Unknown Item", 0)
look ((a,b,c):xs) y
| y == a = (b,c)
| otherwise = look xs y
而事實上,該工程:
type Database = [(Int, String, Int)]
type BillItem = (String, Int)
type BarCode = Int
look :: Database -> BarCode -> BillItem
look [] _ = ("Unknown Item", 0)
look ((a,b,c):xs) y
| y == a = (b,c)
| otherwise = look xs y
main = do
let db = [(111, "Item One", 1),
(222, "Item Two", 2),
(333, "Item Three", 3),
(444, "Item Four", 4),
(555, "Item Five", 5),
(666, "The Beast", 6),
(777, "Item Seven", 7)]
print $ look db 777
print $ look db 111
print $ look db 123
儘管標題,這個功能是*階*一個(沒有作爲參數傳遞函數)。 – chi
瞭解;正如我所說,我是哈斯克爾新手。我的錯誤,我會糾正它。 –