haskell - 通过匹配获取数据元素
问题描述
我有一个格式为[(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]
我的代码中的部分
我是否正确地进行了递归?
解决方案
(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
,你就完成了)。
推荐阅读
- c# - 应用代码混淆后 exe 需要 1-3 分钟才能运行
- sql - SQL - 如何在特定列中选择具有最大值的数据行?[第2部分]
- python - 将 SSH 与应用程序服务器一起使用时 libcrypto.so 中的段错误
- java - 需要使用java读取对象内部的json数组
- amazon-web-services - 将文件直接从 S3 移动到 FTP
- googletest - “SetUpTestCase”或“TearDownTestCase”的拼写错误问题
- django - 序列化器字段可能命名不正确,并且与 GenericRelatedObjectManager 实例上的任何属性或键都不匹配
- ionic-framework - Ionic3 Fileopener 插件对象(…)不是函数错误
- image-processing - 将 Cifar10 数据集转换为 Amazon SageMaker 的 RecordIO 格式
- game-maker - GML 向点移动使对象向右移动