【问题标题】:Return snd element of specific tuple in list of tuples Haskell元组列表中特定元组的返回和元素 Haskell
【发布时间】:2014-03-31 15:31:28
【问题描述】:

我正在尝试返回与 char 具有相同第一个元素的元组的第二个元素。

如果没有与第一个元素具有相同字符的元组,那么我想返回 0

只能有 0 或 1 个与给定 char 具有相同 char 的元组,因此采用列表推导返回的 [Int] 的头部。

这是我写的代码,错误是当我尝试检查元组 (c,) 是否在带有 'elem (c,) m' 的元组列表中时

type Mem = [(Name,Int)]

getVal :: Char -> Mem -> Int
getVal c m
        | elem (c,_) m = head [snd n | n <- m, fst n == c]
        | otherwise = 0

我们将不胜感激地收到解决该问题的方法,或提出更好的解决方法的建议!

谢谢

【问题讨论】:

    标签: list haskell tuples element


    【解决方案1】:

    很简单,如果你知道Prelude就好了。

    import Data.Maybe (fromMaybe)
    
    getVal :: Char -> Mem -> Int
    getVal c = fromMaybe 0 . lookup c
    

    【讨论】:

      【解决方案2】:

      你可以使用find:

      import Data.List
      
      getVal :: Char -> Mem -> Int
      getVal c = maybe 0 snd . find ((==)c) . fst) 
      

      【讨论】:

      • find (c==) 反而更干净了
      【解决方案3】:

      elem (c,_) 不是有效的 haskell 表达式,因为_ 只能用于模式(而不是值)。您几乎可以通过head [snd n | n &lt;- m, fst n == c] 获得解决方案。你应该首先评估它,并检查里面有什么。它会更简单、更安全。

      我会使用类似的东西

      getVal :: Char -> Mem -> Int
      getVal c m = case [snd n | n <- m, fst n == c] of
          [] -> 0
          x:_ -> x
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-19
        • 2016-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多