【问题标题】:Function that query first element in a list of tuples and returns the other two查询元组列表中的第一个元素并返回其他两个元素的函数
【发布时间】:2016-04-16 03:12:32
【问题描述】:

我想要一个元组列表 [(a,b,c)..],其中 a 是字符串,b 和 c 是 Num。我将有一个函数,可能是模式匹配理解,它将仅搜索列表中任何元组中的第一个元素(唯一 ID),如果找到匹配项,该函数将返回元组中剩余的两个元素。

我是编程新手,经过大量研究后,我想我会从 Haskell 开始。我发现这个http://learnyouahaskell.com 开始时非常有用,但我坚持理解和类型注释在模式匹配中的作用。到目前为止,我在语法上看到的一致理解是

{ Manipulate Set B, but mind the predicate | Trim it down further to make Set B | Select set A, Predicate }

我可能听起来天真和懒惰,但老实说,我正在寻找一些快速突破,以便我可以继续前进。提前致谢。

【问题讨论】:

  • 我可能错了,因为我不知道问题的完整描述,但我感觉您在这里使用了错误的数据结构。 Data.Map 通常是保存由唯一键指向的对象的更好选择。此外,自定义数据类型通常是比通用元组更好的选择。

标签: haskell


【解决方案1】:

首先,这是在列表推导中进行模式匹配的方法:

[(b,c) | (a,b,c) <- input]
-- (b,c) constructs your results
-- (a,b,c) is the pattern matching

然后,只需添加您的谓词:

[(b,c) | (a,b,c) <- input, a == id]

而且,由于这些 id 是唯一的,因此您只对第一个匹配项感兴趣,因此只对上述结果中的 take 1 感兴趣。


就个人而言,我更喜欢do 表示法:

do (a,b,c) <- input
   guard (a == id)
   return (b,c)

【讨论】:

  • 谢谢!当你说“构建你的结果”与操纵时,我现在真的明白了。两者听起来可能相同,但当涉及到你的想法时,一个是严格的,另一个是松散的。整洁的有后卫:) 还没有!
【解决方案2】:
getMtach [] _ = []
getMtach ((a, b, c):xs) key
    | (a == key) = (b, c) : getMtach xs key
    | otherwise = getMtach xs key

Main> getMtach [(1, "abc", 12.3), (2, "asg", 4.5), (1, "xyz", 123)] 1
[("abc",12.3),("xyz",123.0)]
*Main> 
*Main> getMtach [(1, "abc", 12.3), (2, "asg", 4.5), (1, "xyz", 123)] 2
[("asg",4.5)]

【讨论】:

    猜你喜欢
    • 2016-08-06
    • 2016-10-31
    • 1970-01-01
    • 1970-01-01
    • 2013-11-26
    • 2013-09-25
    • 2017-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多