我需要编写一个Haskell函数,它以3个字符串作为输入,其中第一个字符串是第三个字符串的一部分,并用第二个字符串替换第一个字符串。
我尝试过使用递归,但似乎我没有正确设置基本情况,还收到了"签名缺少附带的绑定错误"(我对Haskell完全陌生(
change:: String -> String -> String -> String
change [] [] [] = []
change [] ys zs = ys
change xs [] zs = zs
change xs ys [] = []
change (x:xs) (y:ys) (z:zs) = change xs ys zs
此处编码
例如,函数输出应为:更改"你好"再见"你好课"再见班">
我们可以使用Data.Text
的replace :: Text -> Text -> Text -> Text
函数。
首先添加这个杂注{-# LANGUAGE OverloadedStrings #-}
,你可以在这里阅读它https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/glasgow_exts.html#重载字符串文字
那么更改功能将是这样的:
{-# LANGUAGE OverloadedStrings #-}
import Data.Text ( pack, unpack, replace)
change :: String -> String -> String -> String
change xs ys = unpack . replace (pack xs) (pack ys) . pack
正如你所看到的,我正在使用pack
和unpack
来切换Text
和String
请参阅https://hackage.haskell.org/package/text-1.2.4.0/docs/Data-Text.html如果你想了解更多Data.Text
我也是Haskell的新手。正如我所想,您编写的代码没有错误。但它并没有像你想要的那样给出想要的结果。基本上,它根据较短字符串的长度给出一个输出字符串。对于您的示例,输出是"ye类"。
该程序可实现所需结果,
change :: String -> String -> String -> String
change _ _ "" = ""
change l1 l2 (z:zs) = if l1 == take (length l1) (z:zs) then l2 ++ drop (length l1) (z:zs) else z:(change l1 l2 zs)