函数,它接受3个字符串,其中第一个字符串是第三个字符串的一部分,并用第二个字符串更改第三个中的第一个字符串



我需要编写一个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.Textreplace :: 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

正如你所看到的,我正在使用packunpack来切换TextString请参阅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)

相关内容

最新更新