2012-07-13 27 views
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必须在标准?我在Network.CGI.Protocol中发现了replace :: Eq a => a -> a -> [a] -> [a],但它有错误的签名。

+0

你们是不是要做出亵渎过滤器旁路? XD – Mysticial 2012-07-13 16:53:23

+0

'replace'的签名有什么问题?将'a〜Char'设置为'[a]〜String',我们有'Eq Char',那么问题是什么? – dave4420 2012-07-13 16:53:42

+1

@ dave4420第一个问题是,它在'Network.CGI.Protocol'中......作为这种功能的导入非常随意(你可以在更合适的位置找到它) – Jedai 2012-07-13 16:58:12

回答

2

没有,是不是像在标准库magicFunction。但是编写自己很容易,所以除非它是一个经常使用的函数,否则把它放在一个库中是毫无意义的。除了您的版本和丹尼尔·瓦格纳与tailsinits提示,这里有一个简单的实现:

magicFunction find replace = init . helper 
    where 
    helper (c:cs) = if c == find then ((replace:cs):) else id $ map (c:) (helper cs) 
    helper [] = [[]] 
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!","")] 
相关问题