Những gì bạn đang nghĩ đến việc được gọi là bottom
đáy không chỉ dành cho cho thấy một cái gì đó không được thực hiện, nó có nghĩa là để đại diện cho một tính toán gây ra chương trình của chúng tôi thất bại.
Ví dụ chúng tôi thực sự có thể định nghĩa undefined
mình là một vòng lặp vô hạn
undefined = let x = x in x
undefined = undefined
Vì vậy, thực sự những gì chúng tôi đang làm chỉ là đưa vào một giá trị undefined :: a
mà sẽ gây ra hoặc chương trình để sụp đổ hoặc vòng lặp mãi mãi, nhưng không bao giờ đánh giá nó.
Do đó, nếu bạn có một số chức năng lớn và phức tạp mà bạn không biết làm thế nào để thực hiện bạn chỉ có thể làm được điều này
foo :: Bar -> Baz -> Quux
foo bar baz = foo bar baz
Kể từ typechecks này, nó sẽ biên dịch và chúng tôi có thể kiểm tra các bộ phận khác của chúng tôi chương trình.
Tuy nhiên, vì nó vô cùng hữu ích khi có vòng lặp vô hạn khi bạn vô tình chạy phần đó của chương trình, GHC và những người khác thực hiện undefined
theo cách khác. Họ có họ sụp đổ chương trình và phát ra một thông báo lỗi, ví dụ:
-- In GHC
error msg = throw (ErrorCall s)
undefined = error "Prelude.undefined"
Vì vậy, để lại một chức năng không xác định với khả năng gỡ lỗi tốt hơn
foo bar baz = undefined
foo bar baz = error ("Tried to evaluate foo with" ++ show bar ++ show baz)
Nếu bạn đang tìm kiếm các khái niệm về đáy khó hiểu, Hammar đã đăng tuyệt vời answer
Sử dụng 'chưa xác định'. Khi bạn gọi hàm, bạn sẽ nhận được '*** Ngoại lệ: Prelude.undefined'. –
Cách khác, 'isDivisor x y = lỗi" Chưa được triển khai "', hoặc, nếu bạn muốn ghci lặp lại, 'isDivisor x y = isDivisor x y'. –