如何获得返回函数的输出?

时间:2014-10-10 13:53:47

标签: haskell

这是一个新手问题。

我无法理解StripPrefix函数的输出,它返回Maybe [a]。

我正在做的是,我将两个字符串传递给StripPrefix,以便在剪切前缀后返回字符串。

我试过的是:

let b = stripPrefix pref stri

Just b <- stripPrefix pref stri

在第一种情况下,我的打印操作(putStrLn b)会抛出错误&#34;无法匹配类型Maybe [Char]' with [字符]&#39;&#34;

2 个答案:

答案 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.MaybeisJustisNothing

> isJust $ Just 1
True
> isJust $ Nothing
False

显然isNothing = not . isJust

答案 1 :(得分:1)

那是因为putStrLn :: String -> IO ()b :: Maybe StringputStrLn期望其第一个参数为String,并且b不是print :: Show a => a -> IO ()。您可以使用Maybe打印Show值,只要其包含的类型本身为{{1}}即可。