2012-07-13 33 views
6
> magicFunction 'l' '_' "hello world" 
["he_lo world", "hel_o world", "hello wor_d"] 

Có chức năng ma thuật như vậy trong Prelude chuẩn hoặc nó có thể được viết dễ dàng với các chức năng khác không?Tính toán tất cả các khả năng thay thế một ký tự bằng một ký tự khác

Và không, đây không phải là bài tập về nhà, nhưng vẫn không tốn quá nhiều thời gian cho việc giải pháp phức tạp của riêng bạn, tôi muốn tự làm điều đó hơn là phí thời gian của bạn;) chuẩn mực.


EDIT: Đây là nỗ lực đầu tiên của tôi:

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) 

Nó có thể được cải thiện? Chắc chắn một cái gì đó như replace phải ở trong tiêu chuẩn? Tôi đã tìm thấy replace :: Eq a => a -> a -> [a] -> [a] trong Network.CGI.Protocol nhưng chữ ký sai.

+0

bạn đang cố gắng để thực hiện một đường vòng lọc thô tục? XD – Mysticial

+0

Có gì sai với chữ ký 'replace'? Đặt 'a ~ Char' thành' [a] ~ String', và chúng ta có '' Char '', vậy vấn đề là gì? – dave4420

+1

@ dave4420 Vấn đề đầu tiên là nó nằm trong 'Network.CGI.Protocol' ... Khá ngẫu nhiên khi nhập cho loại chức năng này (mà bạn _can_ tìm thấy ở các vị trí thích hợp hơn) – Jedai

Trả lời

2

Không, không có gì giống như magicFunction trong thư viện chuẩn. Nhưng thật dễ dàng để viết cho mình, vì vậy trừ khi đó là một chức năng thường được sử dụng, không có điểm nào đặt nó vào một thư viện. Ngoài phiên bản của bạn và gợi ý Daniel Wagner với tailsinits, đây là một thực hiện đơn giản:

magicFunction find replace = init . helper 
    where 
    helper (c:cs) = if c == find then ((replace:cs):) else id $ map (c:) (helper cs) 
    helper [] = [[]] 
1

Không có gì giống như thế này trong bản phân phối chuẩn. Tuy nhiên, có một mẹo nổi tiếng có thể hình thành sự bắt đầu của giải pháp:

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!","")] 
Các vấn đề liên quan