Bởi vì tôi tìm thấy những câu hỏi thú vị, tôi quyết định viết ra những suy nghĩ của tôi về đề tài này:
logic
Giả sử chúng ta định nghĩa init xs
là "danh sách, rằng, nếu bạn đặt last xs
trên nó cuối cùng, tương đương với xs.Điều này tương đương với: init xs
là danh sách không có phần tử cuối cùng của nó.Đối với xs == []
, không tồn tại thành phần cuối cùng, do đó, init []
phải không xác định.
Bạn có thể thêm một trường hợp đặc biệt cho điều này, như trong "nếu xs là danh sách rỗng, sau đó init xs
là danh sách rỗng, nếu không init xs
là danh sách, rằng, nếu bạn đặt last xs
về kết thúc của nó, là bình đẳng đến xs ". Chú ý cách này tiết kiệm hơn và ít sạch hơn. Chúng tôi giới thiệu thêm sự phức tạp, nhưng những gì cho?
Intuitive
init [1,2,3,4] == [1,2,3]
init [1,2,3] == [1,2]
init [1,2] == [1]
init [1] == []
init [] == ??
Lưu ý cách chiều dài của danh sách ở phía bên tay phải của các phương trình giảm cùng với chiều dài của phía bên trái. Với tôi, loạt bài này không thể được tiếp tục một cách hợp lý, bởi vì danh sách ở phía bên phải sẽ phải có một kích thước tiêu cực!
thực
Như những người khác đã chỉ ra, việc xác định một trường hợp đặc biệt xử lý cho init
hoặc tail
để xem danh sách rỗng như một cuộc tranh cãi, có thể giới thiệu khó chỗ sai sót trong những tình huống mà các chức năng có thể không có hợp lý kết quả cho danh sách trống, nhưng vẫn không tạo ra ngoại lệ cho nó!
Hơn nữa, tôi có thể nghĩ không có thuật toán nào thực sự là lợi thế khi có init []
đánh giá là []
, vậy tại sao lại giới thiệu độ phức tạp thêm? Lập trình là tất cả về sự đơn giản và đặc biệt là Haskell là tất cả về sự tinh khiết, bạn sẽ không đồng ý?
init phải trả về tất cả trừ phần tử cuối cùng của danh sách. Danh sách trống không có phần tử cuối cùng, vì vậy không có init nào. Thêm vào đó, bất biến 'xs == init xs ++ [last xs]' sẽ không còn giữ nếu init được định nghĩa theo cách bạn mô tả. –
@Niklas Nhưng, tương tự như bạn có thể nói, init nên trả về tất cả các phần tử không phải là phần tử cuối cùng, không có các phần tử như vậy vì vậy chúng ta nên trả về danh sách rỗng. – HaskellElephant
@Niklas, nó sẽ không giữ? Ý tôi là nếu cuối cùng [] = [] –