获取列表和整数的函数返回列表

时间:2016-03-07 17:06:52

标签: list function haskell recursion list-comprehension

  

编写一个名为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

我错过了什么?

3 个答案:

答案 0 :(得分:3)

当您以其他方式递归调用findID'时,您错过了m参数。

另请注意,您只返回第一个匹配的值,而不是完整的列表,因此这个新功能不会做正确的事情。

答案 1 :(得分: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 []
[]

答案 2 :(得分:0)

如果你想编写自己的递归解决方案,那么这样的工作

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