2014-10-10 8 views
0

이것은 초보자 용 질문입니다.어쩌면 함수의 출력을 가져 오는 방법은 무엇입니까?

어쩌면 [a]를 반환하는 StripPrefix 함수의 출력을 이해하는 데 문제가 있습니다.

내가하고있는 것은 StripPrefix에 두 개의 문자열을 전달하여 접두사를 자른 후 문자열을 다시 제공한다는 것입니다. 내가 시도 무엇

은 다음과 같습니다

첫 번째 경우에
let b = stripPrefix pref stri 

Just b <- stripPrefix pref stri 

, 내 인쇄 작업 (putStrLn b)는 " '유형 Maybe [Char]' with [숯불]을 일치 할 수 없습니다"입니다

+1

GHCi에서이 작업을 수행하고 있습니까? 'let just b = stripPrefix pref stri'를 시도해보십시오. 그러나'Nothing'을 리턴하면'putStrLn b'를 할 때'b'에 넣을 내용이 없으므로 다른 오류가 발생합니다 변하기 쉬운. – bheklilr

+0

@bheklilr 감사합니다! 이 경우 b가 언제인지를 아는 방법이 있습니까? –

+1

또는'just'의 내부에 적용 할 함수와 기본값을 취하는'maybe' 함수를 사용할 수 있습니다. 그래서'putStrLn $ maybe "할 수 있습니다. Prefix stripping failed .."("Stripped : "++) $ stripPrefix pref stri'입니다. 실패하면 오류 메시지를 인쇄합니다. 성공하면 제거 된 문자열을 인쇄합니다. – bheklilr

답변

3

: 당신이 Maybe a에서 a을 추출 할 경우 GHCi에서

, 당신은 몇 가지 옵션이 있습니다. 당신이이 Just something로 성공 확신하는 경우 첫째, 당신은 그러나

> let Just a = Just 1 
> print a 
1 

을 할 수있는 작업이이 모든 말하는

> let Just a = Nothing :: Maybe Int 
> print a 
*** Exception <interactive>12:5-20: Irrefutable pattern failed for pattern Data.Maybe.Just a 

가 있다는 것입니다 성공하지 못한 경우이 문제가 발생할 수 있습니다 사용 된 패턴 일치가 실패했습니다. 어떻게 이것을 피할 수 있습니까? 사례 명세서가 있습니다.

> -- Enable multiline input (I have this in my .ghci file so it's always on) 
> :set +m 
> let maybeA = Just 1 
| 
> case maybeA of 
| Just x -> print x 
| Nothing -> return() -- Do nothing 
| 
1 

하지만 힘든 일입니다. 하스켈에 대안이 내장되어 있다면 좋지 않을까요? 다행히도, Data.Maybe 모듈에있다 :

> import Data.Maybe 
> :type maybe 
maybe :: b -> (a -> b) -> Maybe a -> b 
> -- The -1 is our default value in case of Nothing 
> print $ maybe (-1) id $ Just 1 
1 
> print $ maybe (-1) id $ Nothing 
-1 

당신이 원하는 모든이 Just의 값 또는 디폴트 값 중 하나 일 때 사용하기에도 쉬운 기능이있다 :

> print $ fromMaybe (-1) $ Just 1 
1 

그러나 maybe이 더이 일반적으로 강력 함 :

> print $ maybe 0 (\x -> 2 * x - x * x * x + 7^x) $ Just 3 
322 

작업이 성공적으로 완료된 경우도 있습니다. 분명히

> isJust $ Just 1 
True 
> isJust $ Nothing 
False 

그리고 isNothing = not . isJust :이를 위해 Data.MaybeisJustisNothing 있습니다.

1

오류가 발생 putStrLn :: String -> IO()b :: Maybe String 때문에 . putStrLn은 첫 번째 인수가 String 일 것으로 예상하며 그 값은 b이 아닙니다. print :: Show a => a -> IO()을 사용하여 Maybe 값을 인쇄 할 수 있습니다. 단, 포함 된 유형은 Show입니다. 질문에 대한 코멘트에서

관련 문제