Tôi đang đọc RWH, và tôi đã đến với chương 9. Nó giới thiệu các đoạn mã sau:Các "xử lý" chức năng và Real World Haskell
import System.IO
import Control.Exception
saferFileSize :: FilePath -> IO (Maybe Integer)
saferFileSize path = handle (\_ -> return Nothing) $ do
h <- openFile path ReadMode
size <- hFileSize h
hClose h
return (Just size)
Nó sẽ không biên dịch tuy nhiên, cho thông báo lỗi sau:
test.hs:5:22:
Ambiguous type variable `e0' in the constraint:
(Exception e0) arising from a use of `handle'
Probable fix: add a type signature that fixes these type variable(s)
In the expression: handle (\ _ -> return Nothing)
In the expression:
handle (\ _ -> return Nothing)
$ do { h <- openFile path ReadMode;
size <- hFileSize h;
hClose h;
return (Just size) }
In an equation for `saferFileSize':
saferFileSize path
= handle (\ _ -> return Nothing)
$ do { h <- openFile path ReadMode;
size <- hFileSize h;
hClose h;
.... }
Điều gì xảy ra ở đây? Tại sao nó không biên dịch?
Tài liệu về chức năng 'xử lý' trên trang web Haskell không rõ ràng về điều này (ít nhất là đối với những người ở cấp nhập cảnh - những người cần tài liệu!) Https://wiki.haskell.org/Exception Cảm ơn bạn đã giải thích rất rõ ràng rằng trình biên dịch chỉ cần chúng tôi xác định các loại ngoại lệ để xử lý! – jocull