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

如何将Haskell的if-then-else代码改写为模式匹配/守卫的规范写法

习题背景

本次习题属于表格美化打印与选择功能系列习题的一部分,要求如下:

编写函数select :: Field → Field → Table → Table,接收列名、字段值、表格三个参数,仅筛选出指定列等于给定字段值的行。如果指定列不存在于表格中,直接返回原表格。(提示:可使用函数(!!)、elemIndex、filter和maybe)

原始实现

你当前的实现功能可正常运行,但使用fromMaybe加if-then-else的写法不符合Haskell惯用风格:

select :: Field -> Field -> Table -> Table
select column value table@(header:rows) =
    let i = fromMaybe (-1) (elemIndex column header)
    in  if i == (-1) then table
        else header : filter (\r -> r !! i == value) rows
规范改写实现

版本1:模式匹配替换fromMaybe

直接对elemIndex返回的Maybe Int结果做模式匹配,完全移除魔数-1和if-then-else判断,逻辑更清晰直观:

select :: Field -> Field -> Table -> Table
select column value table@(header:rows) =
    case elemIndex column header of
        Nothing -> table
        Just i  -> header : filter (\r -> r !! i == value) rows

版本2:使用maybe函数的极简写法

符合题目给出的提示要求,利用maybe函数一行完成逻辑,是函数式编程的惯用风格:

select :: Field -> Field -> Table -> Table
select column value table@(header:rows) = 
    maybe table (\i -> header : filter (\r -> r !! i == value) rows) (elemIndex column header)

两种实现的功能和原始版本完全一致,无额外性能开销,更符合Haskell社区的代码规范。

内容的提问来源于stack exchange,提问作者Lumnar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 04:09:04