首页 > 解决方案 > 通过匹配获取数据元素

问题描述

我有一个格式为[(StudID,Int)]where的数据列表type StudID = String。因此,我有一组数据:

marks = [("8",90),("10",100),("5",86),("3",45)]

我现在想根据每个元组中的第一个元素的匹配 ID 获得第二个值。例如,如果ID我正在寻找的是"5"那么我想要的值86等等。我尝试了以下方法:

getStudMarks :: StudID -> [(StudID,Int)] -> Int
getStudMarks studid [(id,mark):xs] = if studid == id then mark else getStudMarks studid xs

但我被扔了

无法将预期类型 '(StudID, Int)' 与实际类型 '[(StudID, Int)]' 匹配</p>

突出显示[(id,mark):xs]我的代码中的部分

我是否正确地进行了递归?

标签: haskell

解决方案


(id, mark):xs是您要进行模式匹配的列表;您将其包装在另一层括号中,这意味着 type 的值[[(StudID, Int)]]

getStudMarks studid ((id,mark):xs) = if studid == id then mark else getStudMarks studid marks.

但是,您还需要考虑如果getStudMarks接收到一个列表作为其第二个参数会发生什么,如果studid从未找到则会发生这种情况。

getStudMarks _ [] = ???

比较你的函数lookup :: Eq => a -> [(a,b)] -> Maybe b(顺便说一句,这就是你真正需要的;改变getStudMarks, write的类型getStudMarks = lookup,你就完成了)。


推荐阅读