Haskell技术实现:检查字符串是否仅由指定字符集构成
Haskell实现字符串字符检查功能
嘿,恭喜你开启Haskell的旅程!看到你想实现一个检查字符串是否仅包含程序参数传入的指定字符的功能,我来帮你把这个功能完善好~
核心逻辑:纯函数实现
首先,我们先搞定核心的检查逻辑——这个其实不需要用到do块(do主要用于IO操作或者单子上下文),用纯函数就能简洁实现。
核心思路很简单:验证目标字符串里的每一个字符,都存在于允许的字符集合中。Haskell的标准库已经给我们提供了完美的工具:
all:判断列表中所有元素是否满足某个条件elem:检查元素是否在列表(字符串本质就是字符列表)中
把它们结合起来,核心函数可以写成这样:
myCheck :: String -> String -> Bool myCheck allowedChars input = all (`elem` allowedChars) input
举个例子:
myCheck "01" "00110"会返回TruemyCheck "01" "021"会返回False
如果你需要忽略大小写的话,只需要导入Data.Char模块,把两个字符串统一转成小写(或大写)再检查:
import Data.Char (toLower) myCheck :: String -> String -> Bool myCheck allowedChars input = all (`elem` map toLower allowedChars) (map toLower input)
处理程序参数:加上IO逻辑
如果你想通过命令行参数传入这两个字符串(也就是你代码里do块的初衷),我们可以用System.Environment模块来获取命令行参数,然后把核心逻辑和IO结合起来:
完整代码如下:
import System.Environment (getArgs) -- 如果需要大小写忽略,就加上下面这行 -- import Data.Char (toLower) myCheck :: String -> String -> Bool myCheck allowedChars input = all (`elem` allowedChars) input -- 大小写忽略版的myCheck -- myCheck allowedChars input = all (`elem` map toLower allowedChars) (map toLower input) main :: IO () main = do args <- getArgs -- 匹配命令行参数的情况:必须传入两个参数 case args of [allowed, input] -> print $ myCheck allowed input _ -> putStrLn "用法:./checker <允许的字符集> <要检查的字符串>"
编译运行
用GHC编译这个程序:
ghc -o checker checker.hs
然后运行测试:
# 合法情况,输出True ./checker "01" "01010" # 非法情况,输出False ./checker "abc" "abd" # 参数不对的情况,提示用法 ./checker "01"
这样就能完成你想要的功能啦,是不是比想象中简洁很多?Haskell的纯函数风格就是这样,用组合已有函数就能快速实现需求~
内容的提问来源于stack exchange,提问作者Mathis Panzani
相关产品推荐
相关产品推荐

