Haskell列表推导未找到匹配时返回输入值的实现方法
解决Haskell findc函数的匹配与默认返回问题
简洁的标准库实现
最直接的方式是利用Haskell标准库的lookup和fromMaybe函数,这两个工具正好能满足你的需求:
import Data.Maybe (fromMaybe) findc :: Char -> [(Char, Char)] -> Char findc x pairs = fromMaybe x $ lookup x pairs
lookup x pairs会在字符对列表里查找第一个键为x的项,找到返回Just c(c是对应的值),没找到返回Nothing。fromMaybe x的作用是:如果第二个参数是Nothing,就返回默认值x;如果是Just c,就取出c返回。
手动修改列表推导式的实现
如果你不想依赖额外库,也可以修改你原来的列表推导式逻辑,确保永远不会生成空列表:
findc :: Char -> [(Char, Char)] -> Char findc x pairs = head ([c | (n, c) <- pairs, n == x] ++ [x])
- 列表推导式
[c | (n, c) <- pairs, n == x]会生成所有匹配的字符值列表。 - 用
++ [x]把默认值拼接到列表末尾:如果有匹配项,head会取第一个匹配的字符;如果没有匹配,列表就只剩[x],head直接返回原字符。
你原有代码的问题分析
- 第一段代码的错误:
null c完全不合法,null是用来判断列表是否为空的函数,而c是Char类型,两者类型不兼容。 - 第二段代码的问题:列表推导式的条件
if x == n then c==c else c==x逻辑混乱,本质等价于x == n,但当无匹配项时,推导式会生成空列表,调用head会触发运行时错误(head不能处理空列表)。
测试验证
> findc 'B' [('A','F'), ('B','G'), ('C','H')] 'G' > findc 'D' [('A','F'), ('B','G'), ('C','H')] 'D'
内容的提问来源于stack exchange,提问作者Stackbot124
相关产品推荐
相关产品推荐

