Có một số giải pháp cho vấn đề của bạn, tất cả đều dựa trên kết hợp mẫu. Tôi giả sử bạn có hai thuật toán (vì bạn không nêu rõ tên họ, tôi sẽ):
algorithm1 :: a -> Maybe b
algorithm2 :: b -> c
input :: a
1) Pattern matching thường được thực hiện từ một trong hai một tuyên bố trường hợp (dưới đây) hoặc một hàm.
let val = algorithm1 input
in case val of
Nothing -> defaultValue
Just x -> algorithm2 x
Tất cả các giải pháp được trình bày khác sử dụng đối sánh mẫu, tôi chỉ trình bày các chức năng chuẩn thực hiện mẫu phù hợp với bạn.
2) Bản mở đầu (và Data.Maybe) có một số hàm tích hợp để xử lý Maybe
s. Các chức năng maybe là một trong những tuyệt vời, tôi đề nghị bạn sử dụng nó. Nó được định nghĩa trong thư viện chuẩn như:
maybe :: c -> (b -> c) -> Maybe b -> c
maybe n _ Nothing = n
maybe _ f (Just x) = f x
Mã của bạn sẽ trông như thế:
maybe defaultValue algorithm2 (algorithm1 input)
3) Kể từ khi lẽ là một functor bạn có thể sử dụng fmap. Điều này có ý nghĩa hơn nếu bạn không có giá trị mặc định. Định nghĩa:
instance Functor Maybe where
fmap _ Nothing = Nothing
fmap f (Just a) = Just (f a)
Vì vậy, mã của bạn sẽ trông như thế:
fmap algorithm2 (algorithm1 input)
Kết quả này sẽ là một giá trị Maybe
(Nothing
nếu kết quả của algorithm1 là Nothing
).
4) Cuối cùng, và không khuyến khích mạnh mẽ, là fromJust
. Chỉ sử dụng nó nếu bạn dương, thuật toán đầu tiên sẽ trả về Just x
(và không phải Nothing
). Hãy cẩn thận! Nếu bạn gọi fromJust val
khi val = Nothing
thì bạn sẽ nhận được ngoại lệ, điều này không được đánh giá cao trong Haskell.định nghĩa của nó:
fromJust :: Maybe b -> b
fromJust Nothing = error "Maybe.fromJust: Nothing" -- yuck
fromJust (Just x) = x
Rời mã của bạn để trông giống như:
algorithm2 (fromJust (algorithm1 input))
lẽ được sử dụng nếu không chắc chắn của bạn về loại giá trị trả về. Ví dụ, phương thức của bạn có thể trả về một chuỗi lỗi. –
@ Jonathan Fischoff: Có thể là * không * được sử dụng nếu bạn không chắc chắn về loại đó. Không có cách nào phương thức trả về 'Có thể ([(Int, Int)], (Int, Int))' có thể trả về một chuỗi lỗi. Có thể được sử dụng khi bạn không biết nếu bạn sẽ có một giá trị để trả lại hay không, vì vậy bạn có thể trở lại Chỉ là giá trị hoặc Không có gì. – Chuck
@Jonathan Fischoff: Một phần chính xác. Bạn sử dụng Có thể khi không có kết quả (Không có gì), ví dụ: getPosition :: List a -> Maybe Integer'. Bạn sử dụng 'Either' để trả về một trong hai (không có ý định chơi chữ) một giá trị trả về hợp lệ (Phải) hoặc lỗi (Trái). Chỉnh sửa: @Chuck nhanh hơn. – delnan