编写一个名为
findID
的函数:
- 成对列表(学生姓(String),学生ID(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
我错过了什么?
答案 0 :(得分:3)
当您以其他方式递归调用findID'
时,您错过了m
参数。
另请注意,您只返回第一个匹配的值,而不是完整的列表,因此这个新功能不会做正确的事情。
答案 1 :(得分:1)
使用map
和fitler
作为@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 []
[]
答案 2 :(得分:0)
如果你想编写自己的递归解决方案,那么这样的工作
findId [] _ = []
findId ((n,i):xs) m | n==m = i: findId xs m
| otherwise = findId xs m