2014-10-10 45 views
0

這是一個新手問題。如何得到函數返回Maybe?

我無法理解StripPrefix函數返回Maybe [a]的輸出。

我正在做的是,我將兩個字符串傳遞給StripPrefix,以便在剪切前綴後返回字符串。

我曾嘗試是:

let b = stripPrefix pref stri 

Just b <- stripPrefix pref stri 

在第一種情況下,我的打印操作(putStrLn b)拋出錯誤 「無法匹配類型Maybe [Char]' with [字符]'」

+1

你在GHCi做這個嗎?嘗試'讓只是b = stripPrefix pref stri',但是要注意,如果它返回'Nothing',那麼當你執行'putStrLn b'時,它會引發一個不同的錯誤,因爲它沒有任何東西放在'b'中變量。 – bheklilr 2014-10-10 13:59:48

+0

@bheklilr謝謝!任何想法在這種情況下如何知道什麼時候b是Nothing? – 2014-10-10 14:00:58

+1

或者,你可以使用'maybe'函數,它採用一個默認值和一個函數來應用於'Just'的內部,所以你可以'putStrLn $也許'前綴剝離失敗..「(」剝離: 「++)$ stripPrefix pref stri'。如果失敗,它會打印一條錯誤消息。如果成功,它將打印剝離的字符串。 – bheklilr 2014-10-10 14:01:24

回答

3

從對問題的意見:

在GHCI,如果你想提取從Maybe aa你有幾種選擇。首先,如果你相信它會用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 

但這很費力。如果Haskell內置了另外一種選擇,這會不會很好?幸運的是,在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 

儘管如此,你仍然想知道如果一個操作是成功的。爲此,Data.MaybeisJustisNothing

> isJust $ Just 1 
True 
> isJust $ Nothing 
False 

而且isNothing = not . isJust,效果顯着。

1

這是因爲putStrLn :: String -> IO()b :: Maybe StringputStrLn預計它的第一個參數是String,這不是b。您可以使用print :: Show a => a -> IO()來打印Maybe值,前提是它包含的類型本身是Show able。