Trong Erlang, bạn được khuyến khích không khớp các mẫu mà bạn không thực sự xử lý. Ví dụ:Đối sánh mẫu, F # so với Erlang
case (anint rem 10) of
1 -> {ok, 10}
9 -> {ok, 25}
end;
là kiểu được khuyến khích, với kết quả có thể khác dẫn đến kết quả là badmatch
. Điều này là nhất quán với triết lý "để nó sụp đổ" trong Erlang.
Mặt khác, F # sẽ phát hành "mẫu phù hợp không hoàn chỉnh" trong mã F # tương đương, như here.
Câu hỏi đặt ra: tại sao không F # loại bỏ các cảnh báo, một cách hiệu quả bằng cách làm tăng mỗi mô hình kết hợp với một tuyên bố tương đương với
|_ -> failwith "badmatch"
và sử dụng "để cho nó sụp đổ" triết lý?
Chỉnh sửa: Hai câu trả lời thú vị cho đến nay: hoặc để tránh các lỗi có khả năng khi không xử lý tất cả các trường hợp của một kiểu dữ liệu đại số; hoặc vì nền tảng .Net. Một cách để tìm ra đó là kiểm tra OCaml. Vậy, hành vi mặc định trong OCaml là gì?
Chỉnh sửa: Để xóa sự hiểu lầm của .Net những người không có nền tảng trong Erlang. Quan điểm của triết lý Erlang là không tạo ra mã xấu luôn luôn bị treo. Hãy để nó sụp đổ có nghĩa là let some other process fix the error. Thay vì viết hàm để nó có thể xử lý tất cả các trường hợp có thể, hãy để người gọi (ví dụ) xử lý các trường hợp xấu được tự động ném. Đối với những người có nền Java, nó giống như sự khác biệt giữa việc có một ngôn ngữ với các ngoại lệ được kiểm tra, nó phải khai báo mọi thứ nó có thể trả về với mọi ngoại lệ có thể, và có một ngôn ngữ trong đó các hàm có thể tăng các ngoại lệ không được khai báo một cách rõ ràng.
Tôi nghĩ triết lý là chức năng của bạn nên xử lý toàn bộ miền được mong đợi của nó, và trình biên dịch nhắc bạn về điều này. Nếu hàm không xử lý bất kỳ trường hợp nào nhiều hơn hai thì bạn nên hạn chế các đối số theo loại, nếu không thì hãy tính toán tất cả các đối số. Đó là sự hiểu biết của tôi; Tôi tự học về triết lý này. – grettke
@grettke: bạn đã đúng. Triết lý này hoàn toàn trái ngược với triết lý Erlang. Và câu hỏi của tôi là tại sao triết lý này lại ưa thích (hoặc khi nào). Các câu trả lời dưới đây khá sáng. –