在元组Haskell列表中返回特定元组的snd元素

时间:2014-03-31 15:31:28

标签: list haskell tuples element

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

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

只有0或1个元组具有与给定的char相同的char,因此获取列表理解返回的[Int]的头部。

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

type Mem = [(Name,Int)]

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

对这个问题的修复,或建议更好的方法来做到这一点,将会感激不尽!

由于

3 个答案:

答案 0 :(得分:4)

这很简单,如果你知道Prelude那么好。

import Data.Maybe (fromMaybe)

getVal :: Char -> Mem -> Int
getVal c = fromMaybe 0 . lookup c

答案 1 :(得分:2)

您可以使用find

import Data.List

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

答案 2 :(得分:1)

elem (c,_)不是有效的haskell表达式,因为_只能在模式中使用(而不能在值中使用)。您几乎拥有head [snd n | n <- m, fst n == c]的解决方案。你应该首先评估它,并检查里面是什么。它会更简单,更安全。

我会使用像

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