2016-03-07 105 views
0

的元件的功能編寫了一個名爲findID函數接受:是獲得一個列表和一個整數返回列表

  • 的(學生姓氏對(串),學生證(名單3位數的整數)),
  • 學生姓名

和回報:

  • 與此名稱匹配的學生ID列表。

這個工程:

findID xs m = [ snd(x) | x<-xs, fst(x) == m] 

結果:

*Main> findID [("josh",123),("becky",456)] "josh" 
[123] 

但我想不使用列表理解。通過這樣的事情:

findID' (x:xs) m 
    | fst(x) == m = snd(x) 
    | otherwise = findID' xs 

我錯過了什麼?

+3

'過濾器「和」地圖「? – Carsten

+2

你不需要在Haskell的函數參數周圍使用括號。而不是'snd(x)',你應該使用'snd x'來代替。 – comingstorm

回答

3

當您以其他方式遞歸調用findID'時,您缺少m參數。

另請注意,您只返回第一個匹配值,而不是完整列表,所以這個新函數不會做正確的事情。

+0

空列表也沒有基本情況。 – amalloy

1

使用mapfitler爲@Carsten提示:

import Data.String 
findID :: [(String, Integer)] -> String -> [Integer] 
findID xs name = map snd $ filter ((==name).fst) xs 

測試:

*Main> let xs = [("Smith", 123), ("Jones", 456), ("Tran", 789), ("Smith", 012)] 
*Main> findID xs "Jones" 
[456] 
*Main> findID xs "Smith" 
[123,12] 
*Main> findID xs [] 
[] 
0

如果你想編寫自己的遞歸解決這樣的事情會工作

findId [] _ = [] 
findId ((n,i):xs) m | n==m = i: findId xs m 
        | otherwise = findId xs m 
+0

謝謝大家,這非常有幫助! – LukeshotFirst

相關問題