這是一個新手問題。如何得到函數返回Maybe?
我無法理解StripPrefix函數返回Maybe [a]的輸出。
我正在做的是,我將兩個字符串傳遞給StripPrefix,以便在剪切前綴後返回字符串。
我曾嘗試是:
let b = stripPrefix pref stri
Just b <- stripPrefix pref stri
在第一種情況下,我的打印操作(putStrLn b
)拋出錯誤 「無法匹配類型Maybe [Char]' with
[字符]'」
這是一個新手問題。如何得到函數返回Maybe?
我無法理解StripPrefix函數返回Maybe [a]的輸出。
我正在做的是,我將兩個字符串傳遞給StripPrefix,以便在剪切前綴後返回字符串。
我曾嘗試是:
let b = stripPrefix pref stri
Just b <- stripPrefix pref stri
在第一種情況下,我的打印操作(putStrLn b
)拋出錯誤 「無法匹配類型Maybe [Char]' with
[字符]'」
從對問題的意見:
在GHCI,如果你想提取從Maybe a
的a
你有幾種選擇。首先,如果你相信它會用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.Maybe
有isJust
和isNothing
:
> isJust $ Just 1
True
> isJust $ Nothing
False
而且isNothing = not . isJust
,效果顯着。
這是因爲putStrLn :: String -> IO()
和b :: Maybe String
。 putStrLn
預計它的第一個參數是String
,這不是b
。您可以使用print :: Show a => a -> IO()
來打印Maybe
值,前提是它包含的類型本身是Show
able。
你在GHCi做這個嗎?嘗試'讓只是b = stripPrefix pref stri',但是要注意,如果它返回'Nothing',那麼當你執行'putStrLn b'時,它會引發一個不同的錯誤,因爲它沒有任何東西放在'b'中變量。 – bheklilr 2014-10-10 13:59:48
@bheklilr謝謝!任何想法在這種情況下如何知道什麼時候b是Nothing? – 2014-10-10 14:00:58
或者,你可以使用'maybe'函數,它採用一個默認值和一個函數來應用於'Just'的內部,所以你可以'putStrLn $也許'前綴剝離失敗..「(」剝離: 「++)$ stripPrefix pref stri'。如果失敗,它會打印一條錯誤消息。如果成功,它將打印剝離的字符串。 – bheklilr 2014-10-10 14:01:24