Câu hỏi này là về cách mà Scala thực hiện khớp mẫu và đệ quy với các danh sách và hiệu suất của chúng.Hiệu suất đệ quy danh sách Scala
Nếu tôi có một chức năng mà recurses qua một danh sách và tôi làm điều đó với phù hợp trên một nhược điểm, ví dụ như:
def myFunction(xs) = xs match {
case Nil => Nil
case x :: xs => «something» myFunction(xs)
}
Trong Haskell:
myFunction [] = []
myFunction (x:xs) = «something» : myFunction xs
Tôi đang sử dụng cùng ngữ nghĩa như tôi sẽ làm với, ví dụ, Haskell. Tôi không nghĩ sẽ có bất kỳ câu hỏi nào về việc triển khai Haskell vì đó đơn giản là cách bạn xử lý các danh sách. Đối với một danh sách dài (tôi sẽ được hoạt động trên một danh sách với một vài nghìn nút), Haskell sẽ không nhấp nháy (tôi tưởng tượng mặc dù; tôi đã không bao giờ cố gắng).
Nhưng từ những gì tôi hiểu với Scala, báo cáo kết quả trận đấu sẽ gọi phương thức vắt unapply chia danh sách xung quanh các khuyết điểm và mở rộng ví dụ để một chức năng mà không làm gì vào danh sách:
def myFunction(xs) = xs match {
case Nil => Nil
case x :: xs => x :: myFunction(xs)
}
Trong Haskell:
myFunction [] = []
myFunction (x:xs) = x : myFunction xs
nó sẽ gọi áp dụng phương pháp vắt để chống lại với nhau. Đối với một danh sách dài tôi tưởng tượng điều này sẽ rất tốn kém.
Để minh họa, trong trường hợp cụ thể của tôi, tôi muốn kiểm tra lại danh sách các ký tự và tích lũy nhiều thứ, trong đó chuỗi đầu vào là bất cứ thứ gì lên tới vài chục kilobyte.
Tôi có thực sự đang gọi các nhà thầu và bộ giải nén cho mỗi bước đệ quy nếu tôi muốn tái khám trong một danh sách dài không? Hoặc là có tối ưu? Hoặc cách tốt hơn để làm điều đó? Trong trường hợp này, tôi sẽ cần một vài biến tích lũy và rõ ràng là tôi sẽ không đệ quy lên một danh sách không làm gì cả ...
(Vui lòng giải thích Haskell, tôi đã không viết dòng trong hai năm.)
(Và có, tôi sẽ cho đệ quy đuôi.)
Cảm ơn bạn! Có, những gì tôi đang viết sẽ được đệ quy đuôi, đoạn thứ hai là một ví dụ xấu! Những gì tôi thực sự nhằm làm là phân vùng chuỗi đầu vào thành các khối khác nhau dựa trên một số chức năng không tầm thường: kết quả là các bộ tích lũy không phải bất kỳ bản đồ hoặc kiểu đầu ra nào. Có lẽ tôi đã cố gắng đặt câu hỏi quá chung chung trong việc tìm kiếm một mẫu chung mà tôi có thể sử dụng trong trường hợp cụ thể này. – Joe
Vâng, hãy xem ví dụ cuối cùng tôi đã thêm vào. –
Hoàn hảo, trả lời cả hai khía cạnh. Cảm ơn nhiều! – Joe