2016-03-17 85 views
-2

我在那裏我想輸入的功能,例如:不能在Haskell功能的匹配類型

look codeIndex 4719 

凡codeIndex是Database存儲爲[(Int, String, Int)]

的想法是,功能,給予從繪製的索引,和代碼值,將返回元件的尾部在列表中(字符串,整數)

look :: Database -> BarCode -> BillItem 
look [] y = ("Unknown Item", 0) 
look (a,b,c:xs) y 
     | y == a    = (b,c) 
     | otherwise    = ("Unknown Item", 0) 

我最初試圖

look (x:xs) y 
    | y == head x    = tail x 

但這並沒有奏效。我對Haskell很新,這讓我感到困惑不已!

+4

儘管標題,這個功能是*階*一個(沒有作爲參數傳遞函數)。 – chi

+0

瞭解;正如我所說,我是哈斯克爾新手。我的錯誤,我會糾正它。 –

回答

4

所以,儘管我認爲「原始」的方法你提到可能是一個更好的主意,讓我們先得到你的模式匹配錯誤的方式進行:

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 
+0

很可能是我收到的最徹底的答案。謝謝! –

3

優先事項:

look (a,b,c:xs) y 

上面的第一個參數是一個三重,製成ab,並c:xs。第三個組件是一個(非空)列表。

look ((a,b,c):xs) y 

上述第一個參數是三元組的一個(非空)列表。它的第一個三元素是(a,b,c)

未來:記住總是發佈類型錯誤,當你得到一個 - 它可以極大地幫助回答者發現發生了什麼。

+1

該代碼還有一些錯誤。 –

+0

@DanielMartin絕對!我的回答只針對一個問題,即標題中提到的問題。 – chi

2

你有兩個問題; @chi指出的模式匹配,並且您錯誤地處理了第一個項目不匹配的情況。您需要遞歸,以便在列表中每項檢查。此外,您應該返回Maybe BillItem而不是特殊值。

look :: Database -> BarCode -> Maybe BillItem 
look [] y = Nothing 
look ((a,b,c):xs) y 
    | y == a    = Just (b,c) 
    | otherwise    = look xs y