Xem xét description of filter
in the docs:
filter
, áp dụng cho một vị và một danh sách, trả về danh sách những nhân tố này đáp ứng các vị ngữ; tức,
filter p xs = [x | x <- xs, p x]
Để giải thích cho ai đó không hiểu comprehensions danh sách, bạn có thể nói filter
có ba trường hợp:
- (trường hợp đơn giản) khi danh sách được được lọc trống, kết quả cũng trống rỗng
- khi người đứng đầu danh sách được lọc đáp ứng vị từ, đó là một phần của kết quả
- nếu không, bỏ qua phần đầu và lọc phần còn lại của danh sách
Những trường hợp này tương ứng với một trong ba dòng cuối cùng của định nghĩa trong câu hỏi của bạn.
chạm nhỏ có thể làm cho các định nghĩa thành ngữ hơn và do đó dễ dàng hơn để đọc:
filter _ [] = []
filter p (x:xs)
| p x = x : filter p xs
| otherwise = filter p xs
Đối với một danh sách trống, vị từ có thể được bất cứ điều gì ở tất cả, và gạch dưới cho thấy một cách rõ ràng rằng nó không quan trọng trong trường hợp đó.
Thay vì phù hợp với (x:y)
, sử dụng (x:xs)
-think: "cũ và người yêu cũ" -emphasizes rằng bạn đang tách một danh sách vào đầu của nó (kiểu a
) và đuôi (loại [a]
, tức, danh sách các a
).
Cuối cùng, xếp các cuộc gọi đệ quy lên filter
dễ dàng cho phép người đọc thấy rằng trường hợp thứ hai bỏ qua x
.
Nguồn
2010-04-02 18:23:33
@Justice: Tôi tự hỏi, nếu định dạng lại hợp lệ.Có lẽ OP đã thực sự bối rối bởi cách bố trí kỳ lạ? – kennytm