如何将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
相关产品推荐
相关产品推荐

