패턴 매칭을 기반으로하는 여러 가지 해결책이 있습니다. 나는 당신이 두 개의 알고리즘을이 있으리라 믿고있어 (당신이 그 이름을하지 않았기 때문에, 나는 것) :
algorithm1 :: a -> Maybe b
algorithm2 :: b -> c
input :: a
1) Pattern matching는 일반적으로 case 문 (아래) 또는 기능 중 하나에서 이루어집니다.
let val = algorithm1 input
in case val of
Nothing -> defaultValue
Just x -> algorithm2 x
다른 모든 제시된 솔루션은 패턴 일치를 사용합니다. 저는 여러분에게 패턴 일치를 수행하는 표준 함수를 제시합니다.
2) 서곡 (및 Data.Maybe)에는 Maybe
을 처리 할 수있는 몇 가지 기본 제공 함수가 있습니다. maybe 함수는 훌륭한 함수입니다. 사용하는 것이 좋습니다. 같은 표준 라이브러리에 정의되어 : 어쩌면 이후
maybe defaultValue algorithm2 (algorithm1 input)
3) 당신이 fmap 사용할 수있는 functor입니다 :
maybe :: c -> (b -> c) -> Maybe b -> c
maybe n _ Nothing = n
maybe _ f (Just x) = f x
귀하의 코드는 같을 것이다. 기본값이 없으면 더 의미가 있습니다. 정의 :
instance Functor Maybe where
fmap _ Nothing = Nothing
fmap f (Just a) = Just (f a)
그래서 코드가 보일 것처럼 :
fmap algorithm2 (algorithm1 input)
이 출력은 Maybe
값 (Nothing
algorithm1의 결과가 Nothing
경우)를 할 것이다.
4) 마지막으로 강력하게 권장하지 않는 것은 fromJust
입니다. 긍정적 인 경우에만 첫 번째 알고리즘이 Just x
(Nothing
이 아님)을 반환합니다. 조심해! fromJust val
으로 전화하면 val = Nothing
예외가 발생합니다. 하스켈에서는이를 알 수 없습니다.그것의 정의 : 반환 값의 유형의 당신의 확신이 경우
어쩌면
algorithm2 (fromJust (algorithm1 input))
가 사용됩니다
코드를 떠난다는 다음과 같다합니다. 예를 들어, 당신의 메소드가 에러 문자열을 반환 할 수 있습니다. –
@Jonathan Fischoff : 유형을 모를 경우 * 사용하지 않을 수도 있습니다. 메서드 returnng'아마도 ([(Int, Int)], (Int, Int))'는 오류 문자열을 반환 할 수 없습니다. 어쩌면 당신이 반환 할 값을 가지는지 모를 때 사용되기 때문에, 그냥 값을 반환하거나 아무것도 반환 할 수 없습니다. – Chuck
@Jonathan Fischoff : 부분적으로 정확합니다. 예를 들어,'getPosition :: List a -> Maybe Integer'와 같이 아무 결과 (Nothing)도 없을 때 어쩌면 사용합니다. 유효한 값 (오른쪽) 또는 오류 (왼쪽) 중 하나를 반환하려면 '모두'를 사용합니다. 편집 : @ 척 빨리했다. – delnan