Haskell中如何修复replace替换函数的类型匹配问题
解答
Haskell里把单个a类型的值转为[a]类型(单元素列表)的写法非常简单:直接把值放在方括号里就行,比如值v :: a,[v]就是对应的[a]类型值。
顺便提一句,你当前写的replace实现有个类型错误:你的签名里第二个参数x是[a]类型,但实现里相等分支写的是x : replace a x ys。(:)的类型是a -> [a] -> [a],要求左边是单个列表元素,右边是同类型的列表,你这里x本身已经是列表类型,直接用:会报类型不匹配,这里要换成列表拼接运算符++,把替换的内容和后续递归结果拼起来。
修正后的可运行代码:
replace :: Eq a => a -> [a] -> [a] -> [a] replace _ _ [] = [] replace a x (y:ys) | a == y = x ++ replace a x ys | otherwise = y : replace a x ys
这个实现完全符合你给出的示例预期:
replace '?' "a" "" == "" replace 'a' "e" "alma" == "elme" replace 'a' "e" "nincsbenne" == "nincsbenne"
以上三个用例运行后都会返回True。
如果你之前用的是单值替换版本(签名为replace :: Eq a => a -> a -> [a] -> [a]),要适配现在的新版本不需要改原有逻辑,只需要在传第二个参数时,把原来的单个替换值包成单元素列表传入即可,比如旧调用replace 'a' 'e' "alma",改成新接口调用就是replace 'a' ['e'] "alma",返回结果完全一致。
内容的提问来源于stack exchange,提问作者teki2021
相关产品推荐
相关产品推荐

