-1

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

4

1 回答 1

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.List和中处理它们Data.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函数。这应该让你开始,如果你在一两天后仍然无法弄清楚,请在下面评论,我会给你另一个提示。

于 2013-10-20T14:15:45.260 回答