6
> magicFunction 'l' '_' "hello world"
["he_lo world", "hel_o world", "hello wor_d"]

标准 Prelude 中是否有这样的神奇功能,还是可以轻松与其他功能组合?

不,这不是家庭作业,但是,请不要花太多时间手动滚动您自己的复杂解决方案,我宁愿自己做也不愿浪费您的时间;)只是询问它是否在标准中。


编辑:这是我的第一次尝试:

import Data.List (findIndices)

replace i y xs = take i xs ++ y : drop (i+1) xs

magicFunction x y xs = map (\i -> replace i y xs) (findIndices (== x) xs)

可以改进吗?replace当然,标准中必须有类似的东西吗?我在replace :: Eq a => a -> a -> [a] -> [a]中找到Network.CGI.Protocol,但它的签名错误。

4

2 回答 2

2

magicFunction不,标准库中没有类似的东西。但是自己写很容易,所以除非它是一个经常使用的函数,否则将它放在库中是没有意义的。除了您的版本和 Daniel Wagner 使用tailsand的提示之外inits,这里有一个简单的实现:

magicFunction find replace = init . helper
  where
    helper (c:cs) = if c == find then ((replace:cs):) else id $ map (c:) (helper cs)
    helper [] = [[]]
于 2012-07-13T21:44:41.137 回答
1

在标准发行版中没有这样的东西。但是,有一个众所周知的技巧可以形成解决方案的开始:

Prelude Data.List> (\xs -> zip (inits xs) (tails xs)) "Hello, world!"
[("","Hello, world!"),("H","ello, world!"),("He","llo, world!"),("Hel","lo, world!"),("Hell","o, world!"),("Hello",", world!"),("Hello,"," world!"),("Hello, ","world!"),("Hello, w","orld!"),("Hello, wo","rld!"),("Hello, wor","ld!"),("Hello, worl","d!"),("Hello, world","!"),("Hello, world!","")]
于 2012-07-13T18:01:26.257 回答