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 に答える