Haskell中如何过滤可正常运行函数f的字符串列表?
问题分析与解决方案
你的函数报错「Non-exhaustive patterns in function f.」是因为两处模式匹配不完整:
f仅处理了非空字符串(a:arr),未覆盖空字符串""的情况;- 辅助函数
fa只定义了'A'/'T'/'G'/'C'的转换规则,遇到其他字符会触发错误。
要实现「过滤数组中可正常运行f的元素,并返回转换结果」的需求,可采用以下两种方案:
方案一:用Maybe类型兼容失败场景
修改f使其返回Maybe String,遇到非法输入时返回Nothing,再用mapMaybe自动过滤无效元素:
import Data.Maybe (mapMaybe) f :: String -> Maybe String f [] = Just "" -- 若认为空字符串不合法,可改为Nothing f (a:arr) = case fa a of Just convertedChar -> (convertedChar :) <$> f arr Nothing -> Nothing where fa :: Char -> Maybe Char fa 'A' = Just 'T' fa 'T' = Just 'A' fa 'G' = Just 'C' fa 'C' = Just 'G' fa _ = Nothing -- 非法字符返回Nothing
示例用法
main = do let input = ["ATGC", "AXG", "", "TTGGC"] print $ mapMaybe f input -- 输出:["TACG","","AACCG"](若空字符串设为合法)
方案二:先过滤合法元素再转换
先写验证函数筛选出所有字符均为'A'/'T'/'G'/'C'的字符串(可选择排除空字符串),再用修复后的f转换:
-- 验证函数:判断字符串是否合法 isValid :: String -> Bool isValid [] = False -- 若允许空字符串,改为True isValid s = all (`elem` "ATGC") s -- 修复原f的模式匹配 f :: String -> String f [] = "" f (a:arr) = fa a : f arr where fa :: Char -> Char fa 'A' = 'T' fa 'T' = 'A' fa 'G' = 'C' fa 'C' = 'G' fa c = c -- 因已过滤,此分支不会触发
示例用法
main = do let input = ["ATGC", "AXG", "", "TTGGC"] print $ map f $ filter isValid input -- 输出:["TACG","AACCG"]
内容的提问来源于stack exchange,提问作者Shriman Keshri
相关产品推荐
相关产品推荐

