Tôi hiện đang xử lý một chức năng như thế này:
foo = (\(a:b:c:d:e:f:_) -> foobar a b c d e f) . (++ repeat def)
Nói cách khác, được đưa ra một danh sách, nó sử dụng sáu yếu tố đầu tiên cho một cái gì đó, và nếu danh sách đó dài hơn sáu yếu tố, nó sẽ sử dụng def
như một điểm thay thế cho những yếu tố còn thiếu. Đây là tổng số, nhưng các phần của nó không (giống như map fromJust . filter isJust
), vì vậy tôi không thích nó. Tôi đã cố gắng viết lại cái này để nó không cần sử dụng bất kỳ bộ phận nào và nhận được cái này:
foo [] = foobar def def def def def def
foo [a] = foobar a def def def def def
foo [a,b] = foobar a b def def def def
foo [a,b,c] = foobar a b c def def def
foo [a,b,c,d] = foobar a b c d def def
foo [a,b,c,d,e] = foobar a b c d e def
foo (a:b:c:d:e:f:_) = foobar a b c d e f
Về mặt kỹ thuật tôi đã làm những gì tôi muốn, nhưng bây giờ đây là một mớ hỗn độn khổng lồ. Làm thế nào tôi có thể làm điều này một cách thanh lịch và ít lặp đi lặp lại?
case xs ++ repeat def of a:b:c:d:e:f:_ -> ...
là đủ cục bộ mà tôi sẽ không nghĩ hai lần về việc chỉ sử dụng nó và bỏ qua tất cả các máy móc bổ sung mà các câu trả lời hiện có đang giới thiệu. Nói chung, các đối số tổng thể toàn cầu hơn (liên quan đến các bất biến được duy trì trên nhiều lệnh gọi hàm, ví dụ) khiến tôi lo lắng.
takeWithDef
không thể sử dụng được nếu nó trả về một danh sách thông thường, vì chúng ta cần phải khớp mẫu: - / Giải pháp phù hợp là những gì Daniel đã viết dưới đây trong câu trả lời thứ hai của mình. uncons
chỉ nhận được phần tử đầu tiên, vì vậy nó không hữu ích.
uncons :: Default a => [a] -> (a,[a])
cái mà mặc địnhdef
. Hoặc một mặc địnhtakeWithDef
. Và / hoặc một mẫu xem / từ đồng nghĩa mẫu. Điều này đòi hỏi phải viết một số mã trợ giúp, mặc dù.