Haskell新手咨询:如何在函数中传入函数并预处理输入?
在Haskell中给函数传入另一个函数(并实现预处理后调用encode)
核心疑问解答
你提到的“在函数中传入另一个函数”本质就是高阶函数的用法——Haskell里函数是一等公民,天生支持把函数作为参数传递,这是非常基础且常用的特性,不用有任何顾虑。
实现你的预处理需求
你的目标是调用encode前,先对输入字符串做“移除数字+转大写”的预处理,下面是几种简洁的实现方式:
1. 组合预处理函数,手动应用到输入
先把两个预处理逻辑合并成一个函数:
-- 先过滤数字,再转大写(顺序不影响结果,isLetter对大小写字母都生效) preprocess :: [Char] -> [Char] preprocess = convert . noNumber -- 等价于 preprocess s = convert (noNumber s)
之后调用encode时,先对密钥和明文执行预处理:
-- 示例调用 main = do let key = "abc123" plaintext = "Hello456World" print $ encode (preprocess key) (preprocess plaintext)
2. 写一个支持传入预处理的高阶包装函数
如果需要灵活切换预处理逻辑,比如后续可能加别的预处理步骤,可以写一个高阶函数,把预处理函数作为参数传入:
-- 参数:预处理函数、密钥、明文;返回加密结果 encodeWith :: ([Char] -> [Char]) -> [Char] -> [Char] -> [Char] encodeWith preprocess key plaintext = encode (preprocess key) (preprocess plaintext)
调用时直接传入组合好的预处理逻辑:
main = print $ encodeWith (convert . noNumber) "abc123" "Hello456World"
3. 直接封装固定预处理的encode版本
如果不需要灵活切换预处理,也可以直接写一个封装好的加密函数:
encodeWithPreprocess :: [Char] -> [Char] -> [Char] encodeWithPreprocess key plaintext = encode processedKey processedPlaintext where processedKey = convert $ noNumber key processedPlaintext = convert $ noNumber plaintext
额外说明
你写的convert和noNumber其实已经用到了高阶函数:map和filter都是接受函数(toUpper、isLetter)作为参数的高阶函数,这也是Haskell中处理列表的常规方式。
内容的提问来源于stack exchange,提问作者Rishabh Arora
相关产品推荐
相关产品推荐

