这是一个新手问题。
我无法理解StripPrefix函数的输出,它返回Maybe [a]。
我正在做的是,我将两个字符串传递给StripPrefix,以便在剪切前缀后返回字符串。
我试过的是:
let b = stripPrefix pref stri
Just b <- stripPrefix pref stri
在第一种情况下,我的打印操作(putStrLn b
)会抛出错误&#34;无法匹配类型Maybe [Char]' with
[字符]&#39;&#34;
答案 0 :(得分:3)
来自对该问题的评论:
在GHCi中,如果您想从a
中提取Maybe 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
。
答案 1 :(得分:1)
那是因为putStrLn :: String -> IO ()
和b :: Maybe String
。 putStrLn
期望其第一个参数为String
,并且b
不是print :: Show a => a -> IO ()
。您可以使用Maybe
打印Show
值,只要其包含的类型本身为{{1}}即可。