You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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直接返回原字符。

你原有代码的问题分析

  1. 第一段代码的错误:null c完全不合法,null是用来判断列表是否为空的函数,而c是Char类型,两者类型不兼容。
  2. 第二段代码的问题:列表推导式的条件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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 14:05:31