在Haskell中查找并替换

时间:2013-10-20 11:16:41

标签: haskell replace

我想输入一个包含2个元素字符列表(只是字母)的列表,其中第一个元素是String中的一个字母(findAndReplace的第二个参数),第二个是我想要更改的内容。在Haskell中是否已经有一个类似的功能?因为这会有很大的帮助!

1 个答案:

答案 0 :(得分:1)

听起来您可能希望使用元组列表而不是第一个输入的列表列表,因为您指定了固定长度。元组是固定长度的集合,可以具有混合类型,而列表是单个类型的任意长度集合:

myTuple = ('a', 'b') :: (Char, Char)
myTriple = ('a', 'b', 'c') :: (Char, Char, Char)
myList = ['a'..'z'] :: [Char]

注意我必须指定元组的每个字段的类型。另外,(Char, Char) (Char, Char, Char)的类型相同,但它们不兼容。

因此,使用元组,您可以将replace的类型签名设为:

replace :: [(Char, Char)] -> String -> String

现在这指定了类型签名,它必须是要查找和替换的字符对的列表,您不必处理错误的输入,例如,如果某人只给了一个字符来搜索但不是一个用。替换它。

我们现在正在传递通常所说的关联列表,而Haskell甚至还有一些内置函数可以在Data.ListData.Map中处理它们。但是,对于这个练习,我认为我们不需要它。

现在你想要使用一对配对来解决这个问题,但如果我们只使用一对解决它就会更容易:

replace1 :: (Char, Char) -> String -> String
replace1 (findChr, replaceChr) text = ?

现在,您要检查text的每个字符,如果它等于findChr,您要将其替换为replaceChr,否则请不要管它。

replace1 (findChr, replaceChr) text = map (\c -> ...) text

我会让你填写详细信息(提示:if-then-else)。

然后,您可以使用它来使用更简单的replace函数构建replace1函数。这应该让你开始,如果你仍然无法在一两天后弄明白,请在下面评论,我会给你另一个提示。