我需要从字符串列表中更改一个字符串(如果字符串只是一个字母,则为chars),而另一个列表中的另一个字符串。签名如下所示:
replace :: [(String, String)] -> String -> String
我应该使用函数words
/ unwords
。例如我有[("train","Car")]
“约翰被火车撞了。”如果我跑它,结果必须是“约翰被车撞了。”。你看到“火车”字符串被替换为“汽车”字符串。
我尝试了一切,但我无法理解。 你能帮我解决这个问题吗?
答案 0 :(得分:0)
让我们使用map change
将change
函数应用于每个字符串。
lookup :: Eq a => a -> [(a, b)] -> Maybe b
会检查匹配a
的对列表,如果找到,则为Just b
,否则为Nothing
。让我们检查一下lookup oldString changeList
的输出,如果我们得到Nothing
,请用oldString
替换newString
,如果我们得到replace changeList input = map change input where
change oldString = case lookup oldString changeList of
Just newString -> newString
Nothing -> oldString
,请使用{{1}}:
{{1}}
答案 1 :(得分:0)
我不确定我理解你的问题,但你可能想要
replace xs w w' = map (\(a,b) -> (a,if b == w then w' else b)) xs
例如:replace [(1,2), (3,2), (5,4)] 2 0
=> [(1,0), (3,0), (5,4)]
。这个函数概括,并且应该对字符串起作用。
答案 2 :(得分:0)
请注意,其他提供的解决方案更为惯用。既然听起来像是在教你并且需要以这种方式构建它,这里有一个使用words
/ unwords
和显式递归的例子:
replace :: [(String, String)] -> String -> String
replace a b = unwords $ foldl inner (words b) a
where inner ls tup = replace' tup ls
replace' :: (String, String) -> [String] -> [String]
replace' tup (x:xs)
| x == fst tup = snd tup : replace' tup xs
| otherwise = x : replace' tup xs
replace' _ [] = []
当您使用标点符号时,此words
方法会中断,但它适用于简单示例:
*Main> replace [("train", "car"), ("dog", "cat")] "dog cannot drive a train"
"cat cannot drive a car"