2010-07-30 2 views
15

내가 다른 함수에서이를 호출하고 데이터에 대해 작업을 수행하려는 Maybe ([(Int,Int)],(Int,Int))포함 "그냥"

의 반환 형식이있는 기능을 가지고있는 어쩌면에서 수익에 운영.

그러나 반환 값은 Just 내에 있습니다. 두 번째 방법은 ([(Int,Int)],(Int,Int))이므로 Just ([(Int,Int)],(Int,Int))을 허용하지 않습니다.

두 번째 방법을 적용하기 전에 Just을자를 수있는 방법이 있습니까?

Maybe 내에서 Just의 사용을 완전히 이해하지 못하고 있지만 첫 번째 메소드의 반환 유형은 Maybe이어야합니다.

+0

가 사용됩니다

fromJust :: Maybe b -> b fromJust Nothing = error "Maybe.fromJust: Nothing" -- yuck fromJust (Just x) = x 

코드를 떠난다는 다음과 같다합니다. 예를 들어, 당신의 메소드가 에러 문자열을 반환 할 수 있습니다. –

+7

@Jonathan Fischoff : 유형을 모를 경우 * 사용하지 않을 수도 있습니다. 메서드 returnng'아마도 ([(Int, Int)], (Int, Int))'는 오류 문자열을 반환 할 수 없습니다. 어쩌면 당신이 반환 할 값을 가지는지 모를 때 사용되기 때문에, 그냥 값을 반환하거나 아무것도 반환 할 수 없습니다. – Chuck

+0

@Jonathan Fischoff : 부분적으로 정확합니다. 예를 들어,'getPosition :: List a -> Maybe Integer'와 같이 아무 결과 (Nothing)도 없을 때 어쩌면 사용합니다. 유효한 값 (오른쪽) 또는 오류 (왼쪽) 중 하나를 반환하려면 '모두'를 사용합니다. 편집 : @ 척 빨리했다. – delnan

답변

6

찾고 계시는 분은 fromJust입니다. 그러나 당신이 특정 경우에만 Maybe 함수는 Nothing을 반환하지 않을 것이다!

+0

감사합니다. 저는이 메소드에서 호출 할 때 항상 값을 반환합니다. 왜냐하면 저는 다른 것을 위해 작성된 메소드를 재활용하기 때문입니다. – KeepItFoolish

+11

fromJust는 Haskell에서 나쁜 형태로 간주됩니다. 마찬가지로'head'와 같은 부분적인 함수도 있습니다. 나는 TomMD의 대답에서 대안 중 하나를 추천 할 것이다. – luqui

46

패턴 매칭을 기반으로하는 여러 가지 해결책이 있습니다. 나는 당신이 두 개의 알고리즘을이 있으리라 믿고있어 (당신이 그 이름을하지 않았기 때문에, 나는 것) :

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)) 
+3

나는 그것을 다른 방향으로 돌린다 : 패턴 매칭은 '미정 (Maybe)'결과를 다루기위한 표준적인 방법이며, 나머지는 그것을 수행하는 일반적인 방법의 약자이다. (OP가 아마 그들을 알지 못하기 때문에, 나는 그들의 정의도 언급 할 것이다.) –

+0

좋은 지적. 되돌아 보면, 나는 그것이 단지 응답자이고 비공식적으로 받아 들여 졌기 때문에 단지'fromJust'로 시작했다고 생각합니다. –

+0

'yuck'에도 불구하고, 나는 이것을 이해하는 가장 쉬운 방법을 찾았다. 어쨌든 귀하의 답변 주셔서 감사합니다. – vikingsteve