我正在尝试返回与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
对这个问题的修复,或建议更好的方法来做到这一点,将会感激不尽!
由于
答案 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