Làm cách nào để viết một hàm trong Haskell, có chuỗi đầu vào theo định dạng a1a2a3 và mở rộng thành a1a2a2a3a3a3. Ví dụ: chuỗi đầu vào "mã" sẽ được mở rộng thành "coodddeeee"Học Haskell: Câu hỏi thao tác chuỗi
Trả lời
lẽ rất không hiệu quả :)
f :: Int -> [Char] -> [Char]
f _ [] = []
f n (c:s) = (replicate n c) ++ (f (n+1) s)
g :: [Char] -> [Char]
g s = f 1 s
.
*Main> g "code"
"coodddeeee"
FYI: juxtaposition liên kết chặt chẽ hơn bất cứ điều gì nhưng @, vì vậy bạn có thể loại bỏ một vài dấu ngoặc đơn quá hoang tưởng. f n (c: s) = sao chép n C++ f (n + 1) s –
Vì vậy, bạn muốn nhân vật nth
được lặp lại n
lần.
f :: String -> String
f x = concatMap g (zip x [1..])
where
g (x,y) = replicate y x
Tôi chắc chắn có cách dễ dàng hơn để thực hiện việc này.
Giải thích: Trước tiên, chúng tôi lấy chuỗi và ghép nối với vị trí của nó trong danh sách (bắt đầu từ 1). Đây là những gì zip hiện:
Prelude> zip "code" [1..]
[('c',1),('o',2),('d',3),('e',4)]
Sử dụng chức năng sao chép sao chép bất cứ điều gì bạn muốn y lần. Vì vậy, chúng tôi nhân rộng x, y lần.
Prelude> g ('z',4)
"zzzz"
Nếu chúng ta bản đồ chức năng này qua danh sách sản xuất bạn sẽ có được kết quả:
Prelude> map g $ zip "code" [1..]
["c","oo","ddd","eeee"]
Nếu bạn có một danh sách các chuỗi, bạn có thể nối chúng lại với nhau bằng concat
. concatMap
áp dụng hàm g
cho mỗi cặp chữ cái và số và sau đó nối chuỗi vào kết quả cuối cùng.
Prelude> concat $ map g $ zip "code" [1..]
"coodddeeee"
Về cơ bản: concat $ map g
->concatMap g
EDIT: bây giờ nó hoạt động, nó cũng có thể được thực hiện trong một dòng thusly:
f x = concatMap (\(a,b)->replicate b a) $ zip x [1..]
Output:
Prelude> f "lambda"
"laammmbbbbdddddaaaaaa"
Jonno ... Bạn có thể giải thích câu trả lời đó, Như một người đang ở giai đoạn đầu học haskell, câu trả lời ở trên không có ý nghĩa với tôi. –
Xem phần chỉnh sửa để giải thích –
Tôi sẽ thay thế 'g' bằng' uncurry. flip replicate'. Điều tương tự, nhưng sử dụng các hàm thư viện Haskell chuẩn. –
import Control.Monad
f = zip [1..] >=> uncurry replicate
mang
Main> f "code"
"coodddeeee"
Tốt! Đối với những người như tôi, người không biết loại người điều hành: "Thành phần Kleisli từ trái sang phải của các đơn vị:' (> =>) :: Monad m => (a -> mb) -> (b -> mc) -> (a -> mc) '" –
Prelude> let l = "code" in concat $ [take y $ repeat (last $ take y l) | y <- [1..length l]]
"coodddeeee"
Tại sao người ta ghét comprehensions danh sách?
Prelude> let f s = concat [ replicate x y | (x,y) <- zip [1..] s]
Prelude> f "code"
"coodddeeee"
hoặc nếu bạn muốn phát điên với phần mở rộng
Prelude> :set -XParallelListComp
Prelude> let f s = concat [ replicate x y | x <- [1..] | y <- s]
Prelude> f "code"
"coodddeeee"
- 1. Mẫu thao tác chuỗi
- 2. nodejs: chuỗi thao tác
- 3. Thao tác chuỗi vs Regexps
- 4. Haskell chức năng thành phần câu hỏi
- 5. Chuỗi thao tác đối tượng
- 6. Thao tác chuỗi trong jQuery
- 7. Thao tác trừ trên chuỗi
- 8. Thao tác chuỗi truy vấn trong Java
- 9. Tối ưu hóa thao tác chuỗi F #
- 10. Câu hỏi thiết kế triết học cho OOP-Tetris
- 11. Một số câu hỏi về các monads trong Haskell
- 12. Java DecimalFormat Ký hiệu khoa học Câu hỏi
- 13. C# .NET GetHashCode câu hỏi chức năng
- 14. Thao tác chuỗi trong vỏ cá
- 15. Thao tác bằng số sử dụng chuỗi
- 16. Trợ giúp Regex với thao tác chuỗi
- 17. Phương pháp xóa Ruby (thao tác chuỗi)
- 18. Thao tác chuỗi XML trong JS?
- 19. Thao tác chuỗi PHP: Extract hrefs
- 20. Thao tác chuỗi với & hoặc + trong VB.NET
- 21. Thao tác thao tác không kích hoạt
- 22. Thao tác động cơ V8
- 23. Thao tác số học dẫn đến tràn. (Thêm số nguyên)
- 24. Thao tác phương trình toán học trong Python
- 25. câu hỏi về nguồn gốc của chuỗi?
- 26. Câu hỏi thay thế chuỗi C#
- 27. C++ câu hỏi lớp học ảo tinh khiết
- 28. Hai câu hỏi về Toán học nhanh chóng
- 29. Câu hỏi thiết kế lớp học newbie của Python
- 30. Câu hỏi phản chiếu Java
Xin vui lòng gửi mã bạn đã viết để giải quyết việc này cho đến nay. Nếu không thì mọi người có thể nghi ngờ đây là bài tập về nhà. –
Tôi đảm bảo với bạn, đây không phải là bài tập về nhà :) Tôi đã làm việc thông qua các excersises trong một cuốn sách Haskell và bộ não của tôi chỉ đóng băng lên trên này. Tất cả tôi biết tại thời điểm này là, tôi sẽ cần phải sử dụng nhà điều hành ++, một số loại thao tác mảng và có thể sử dụng chức năng chiều dài –