Tôi mới sử dụng cả Haskell và lập trình. Câu hỏi của tôi về ràng buộc trong các hàm đệ quy, khớp với mẫu. Ví dụ, giả sử tôi có một hàm kiểm tra xem một danh sách cụ thể (x: xs) là một danh sách con của một danh sách khác, (y: ys). suy nghĩ ban đầu của tôi, sau các ví dụ trong sách giáo khoa của tôi, là:Haskell - Ghép mẫu và đệ quy
sublist [] ys = True
sublist xs [] = False
sublist (x:xs) (y:ys)
| x == y = sublist xs ys
| x /= y = sublist (x:xs) ys
này hoạt động trên dữ liệu thử nghiệm, ví dụ,
sublist [1, 2, 3] [1, 2, 4, 1, 2, 3]
nơi tôi mong đợi nó đến thất bại. Tôi hy vọng nó sẽ thất bại, vì
sublist [1, 2, 3] [1, 2, 4, 1, 2, 3]
= sublist [2, 3] [2, 4, 1, 2, 3]
= sublist [3] [4, 1, 2, 3]
tại thời điểm đó, tôi nghĩ, [3] = 3: [] sẽ được xuất hiện với (x: xs) trong sublist, và [4, 1, 2, 3 ] sẽ được khớp với (y: ys) trong danh sách con. Làm thế nào, sau đó, là danh sách phụ làm việc?
Chỉnh sửa: Nhờ mọi người ở đây, tôi nghĩ rằng tôi đã giải quyết được vấn đề của mình. Như đã nói, tôi đã ("vô thức") muốn danh sách phụ quay lại cho tôi. Sử dụng câu trả lời cuối cùng (BMeph) được đăng dưới dạng hướng dẫn, tôi đã quyết định tiếp cận vấn đề khác nhau, để giải quyết "vấn đề ràng buộc", tức là vấn đề "backtracking".
subseq :: (Eq a) => [a] -> [a] -> Bool
subseq [] _ = True
subseq _ [] = False
subseq (x:xs) (y:ys) =
-- subseq' decides whether the list bound to (x:xs) = M is a prefix of the list
-- bound to L = (y:ys); it recurses through L and returns a Bool value. subseq
-- recurses through M and L, returning a disjunction of Bool
-- values. Each recursive call to subseq passes M and ys to subseq', which
-- decides whether M is a prefix of the **current list bound to ys**.
let subseq' :: (Eq a) => [a] -> [a] -> Bool
subseq' [] _ = True
subseq' _ [] = False
subseq' (x:xs) (y:ys) = (x == y) && subseq' xs ys
in subseq' (x:xs) (y:ys) || subseq (x:xs) ys
nó không rõ ràng, những gì là không và những gì bạn mong đợi thất bại. Trong ví dụ của bạn, [3] là danh sách con của [4,1,2,3] vì vậy sẽ khớp. Tôi đoán đó không phải là những gì bạn muốn. – mb14
Mới để lập trình và bắt đầu với Haskell? Tôi tôn trọng điều đó! Bạn đang ở trong một thế giới của đau đớn khi bạn nhận được để xem làm thế nào phần còn lại của chúng ta trong lập trình bắt buộc phải viết mã. : P – wheaties
Xin lỗi, tôi nên rõ ràng hơn: Tôi mong đợi chức năng không làm những gì tôi muốn, đó là: tìm xem liệu một chuỗi cụ thể, ví dụ, (1: 2: 3: []), xuất hiện trong một danh sách, ví dụ, (4: 1: 2: []), theo thứ tự đó. Gián tiếp, tôi đã hỏi làm thế nào để có được "sublist" chức năng của tôi để khởi động lại tại gốc (x: xs) ràng buộc một lần (x/= y) đánh giá là True. – danportin