我想输入一个包含2个元素字符列表(只是字母)的列表,其中第一个元素是String中的一个字母(findAndReplace的第二个参数),第二个是我想要更改的内容。在Haskell中是否已经有一个类似的功能?因为这会有很大的帮助!
答案 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.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
函数。这应该让你开始,如果你仍然无法在一两天后弄明白,请在下面评论,我会给你另一个提示。