Lưu ý cho những người đóng góp tiềm năng khác: Vui lòng sử dụng ký hiệu trừu tượng hoặc toán học để đưa ra quan điểm của bạn. Nếu tôi thấy câu trả lời của bạn không rõ ràng, tôi sẽ yêu cầu làm sáng tỏ, nhưng nếu không, hãy thoải mái thể hiện bản thân một cách thoải mái.
Nói rõ hơn: Tôi không tìm kiếm một "két an toàn" head
, cũng không phải là sự lựa chọn head
đặc biệt có ý nghĩa đặc biệt. Phần chính của câu hỏi theo sau cuộc thảo luận về head
và head'
, dùng để cung cấp ngữ cảnh.
Tôi đã hack Haskell được vài tháng rồi (đến mức nó đã trở thành ngôn ngữ chính của tôi), nhưng phải thừa nhận rằng tôi không được thông tin đầy đủ về một số khái niệm nâng cao hơn cũng như chi tiết về triết lý của ngôn ngữ (mặc dù Tôi sẵn sàng học hỏi). Câu hỏi của tôi sau đó không phải là vấn đề kỹ thuật quá nhiều (trừ khi nó đúng và tôi không nhận ra nó) vì nó là một trong những triết học.
Đối với ví dụ này, tôi đang nói đến head
.
Như tôi tưởng tượng bạn sẽ biết,
Prelude> head []
*** Exception: Prelude.head: empty list
Điều này theo sau từ head :: [a] -> a
. Đủ công bằng. Rõ ràng là người ta không thể trả về một phần tử không thuộc loại (vẫy tay). Nhưng đồng thời, nó rất đơn giản (nếu không muốn nói là tầm thường) để xác định
head' :: [a] -> Maybe a
head' [] = Nothing
head' (x:xs) = Just x
Tôi đã thấy một số thảo luận nhỏ về điều này ở đây trong phần bình luận của một số tuyên bố nhất định. Đáng chú ý, một Alex Stangl nói
'Có những lý do chính đáng để không làm cho mọi thứ trở nên "an toàn" và đưa ra các ngoại lệ khi các điều kiện tiên quyết bị vi phạm.'
Tôi không nhất thiết phải thắc mắc về khẳng định này, nhưng tôi tò mò không biết những "lý do chính đáng" này là gì.
Ngoài ra, Paul Johnson nói,
'Ví dụ: bạn có thể xác định "safeHead :: [a] -> Có thể là", nhưng bây giờ thay vì xử lý một danh sách trống hoặc chứng minh điều đó không thể xảy ra, bạn phải xử lý "Không có gì" hoặc chứng minh điều đó không thể xảy ra . '
Giọng điệu mà tôi đọc được từ nhận xét đó cho thấy rằng đây là một sự gia tăng đáng kể về độ khó / độ phức tạp / điều gì đó, nhưng tôi không chắc rằng mình nắm được những gì anh ấy đang đưa ra ở đó.
Một Steven Pruzina nói (năm 2011, không kém),
"Có một lý do sâu xa hơn tại sao ví dụ: 'head' không thể chống được sự cố. Để trở nên đa hình nhưng vẫn xử lý một danh sách trống, 'head' phải luôn trả về một biến kiểu không có trong bất kỳ danh sách trống cụ thể nào. Nó sẽ là Thật tuyệt nếu Haskell làm được điều đó ... ”.
Tính đa hình có bị mất khi cho phép xử lý danh sách trống không? Nếu vậy, làm thế nào và tại sao? Có trường hợp cụ thể nào làm cho điều này rõ ràng không? Phần này được trả lời bởi @Russell O'Connor. Tất nhiên, bất kỳ suy nghĩ nào khác đều được đánh giá cao.
Tôi sẽ chỉnh sửa điều này như sự rõ ràng và đề xuất ra lệnh. Bất kỳ suy nghĩ, giấy tờ, vv, bạn có thể cung cấp sẽ được đánh giá cao nhất.