我有这个派生数据类型AcInfo,它由以下用户创建的数据类型组成
[(AcNo, Name, City, Amnt)]
(所有字符串除了Amnt之外是Int)我想要的是通过检查AcNo从以下列表中获取元组。
我做了一点宣言,但我发现很难弄清楚接下来要做什么。声明:
accountDetails :: AcInfo -> AcNo -> [Name, City, Amnt]
accountDetails dbase number
列表理解的使用是否有用?此外,寻求解决方案的好方法是什么?
提前致谢。
答案 0 :(得分:3)
你可以很容易地用列表推导来做到这一点:
locateAcct :: AcNo -> [(AcNo, Name, City, Amnt)] -> (AcNo, Name, City, Amnt)
locateAcct account db = head [ tup | tup@(ac, _, _, _) <- db, ac == account ]
当然,通过使用head
,我们可以打开失败的可能性。也许更好的方法是使用类似safe library的headMay版本,如果列表为空则返回Nothing:
locateAcct :: AcNo -> [(AcNo, Name, City, Amnt)] -> Maybe (AcNo, Name, City, Amnt)
locateAcct account db = headMay [ tup | tup@(ac, _, _, _) <- db, ac == account ]
现在,如果该帐户不存在,您将获得Nothing而不是模式匹配失败。
答案 1 :(得分:1)
find ((==) target . fst4)
:http://zvon.org/other/haskell/Outputlist/find_f.html
其中fst4
是fst
的版本,需要4个元组。不确定它是否在库中,但很容易编写。