[Câu hỏi này được thúc đẩy bởi Chương 9 trong "Real World Haskell"]
Dưới đây là một chức năng đơn giản (cắt xuống đến yếu tố cần thiết):
saferOpenFile path = handle (\_ -> return Nothing) $ do
h <- openFile path ReadMode
return (Just h)
Tại sao tôi cần điều đó $
?
Nếu đối số thứ hai để xử lý không phải là một khối, tôi không cần nó. Các công trình sau đây chỉ hoạt động tốt:
handle (\_ -> putStrLn "Error calculating result") (print x)
Khi tôi cố gắng xóa việc biên soạn $
không thành công. Tôi có thể lấy nó để làm việc nếu tôi một cách rõ ràng thêm dấu ngoặc, ví dụ:
saferOpenFile path = handle (\_ -> return Nothing) (do
h <- openFile path ReadMode
return (Just h))
tôi có thể hiểu rằng, nhưng tôi đoán tôi hy vọng rằng khi Haskell chạm do
nó nên suy nghĩ "Tôi bắt đầu một khối", và chúng ta không cần phải đặt rõ ràng $
ở đó để phá vỡ mọi thứ.
Tôi cũng nghĩ về đẩy khối việc phải làm để dòng tiếp theo, như thế này:
saferOpenFile path = handle (\_ -> return Nothing)
do
h <- openFile path ReadMode
return (Just h)
nhưng điều đó không làm việc mà không Parens một trong hai. Gây bối rối cho tôi, bởi vì các công việc sau:
add a b = a + b
addSeven b = add 7
b
tôi chắc chắn rằng tôi sẽ chỉ đạt được điểm mà tôi chấp nhận nó như "đó chỉ là cách bạn viết thành ngữ Haskell", nhưng không ai có bất kỳ góc độ để cung cấp cho ? Cảm ơn trước.
Xin lỗi, mọi người, tôi không biết stackoverflow rất tốt. Mã chỉ là thùng rác. (Tại sao không có "Câu hỏi Xem trước"). Tôi sẽ cố gắng đăng lại nó. – Jonathan
chỉ cần nhấn nút "mã" trên thanh công cụ của trình soạn thảo (trông giống như một cặp dấu ngoặc ôm). Ngoài ra, bản xem trước ở ngay bên dưới nơi bạn nhập, cập nhật theo thời gian thực ... – Jon
Ah, NoScript cần thiết để cho phép thêm một miền nữa! Có vẻ ổn thôi. Cảm ơn, Jon! – Jonathan