Tôi đang chuyển một ứng dụng Java sang Haskell. Phương pháp chính của ứng dụng Java theo mẫu:Làm thế nào để thực hiện lối ra/trả lại sớm trong Haskell?
public static void main(String [] args)
{
if (args.length == 0)
{
System.out.println("Invalid number of arguments.");
System.exit(1);
}
SomeDataType d = getData(arg[0]);
if (!dataOk(d))
{
System.out.println("Could not read input data.");
System.exit(1);
}
SomeDataType r = processData(d);
if (!resultOk(r))
{
System.out.println("Processing failed.");
System.exit(1);
}
...
}
Vì vậy, tôi có các bước khác nhau và sau mỗi bước tôi có thể thoát ra với một mã lỗi, hoặc tiếp tục sang bước tiếp theo.
nỗ lực của tôi tại porting này để Haskell diễn ra như sau:
main :: IO()
main = do
a <- getArgs
if (null args)
then do
putStrLn "Invalid number of arguments."
exitWith (ExitFailure 1)
else do
-- The rest of the main function goes here.
Với giải pháp này, tôi sẽ có rất nhiều lồng nhau if-then-else
(một cho mỗi điểm lối ra của mã Java bản gốc).
Có cách nào thanh lịch/thành ngữ hơn để triển khai mẫu này trong Haskell không? Nói chung, một cách thành ngữ Haskell để thực hiện một lối ra/trả lại sớm như được sử dụng trong một ngôn ngữ bắt buộc như Java là gì?
Vui lòng đọc ví dụ về Đi bộ đường từ trang http://learnyouahaskell.com/a-fistful-of-monads. Nó cho ví dụ về Monad sử dụng Có lẽ datatype. Một khi kết quả của bất kỳ biểu thức là Không có gì, kết quả của tất cả các biểu thức sau là Không có gì, tốt như bạn đã thoát tại điểm thất bại. –
@ManojR - Có lẽ không thực sự phù hợp ở đây vì bạn cũng muốn lý do cho sự thất bại. – Lee
Cách tiếp cận cổ điển là tách quy trình thành chức năng xử lý "tin cậy" (giả định các tham số chính xác) và chức năng kiểm tra độ sáng "hoang tưởng" (chỉ kiểm tra xem thông số có chính xác không) ... –