2013-05-22 22 views
7

Nếu tôi nhớ chính xác từ trường, có một chức năng hoặc từ khóa được sử dụng cho "chưa được triển khai" nhưng mã biên dịch. Tôi đã cố gắng tìm kiếm nó, nhưng không thể tìm thấy. Có ai biết tôi đang tìm gì không?"No operation" haskell

là của một cái gì đó giống như

isDivisor :: Integer -> Integer -> Bool 
isDivisor x y = None 
--isDivisor x y = (rem x y) == 0 
+1

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'. –

+1

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'. –

Trả lời

8

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