在case语句中解析错误

时间:2015-06-27 11:07:20

标签: haskell pattern-matching type-conversion parse-error maybe

我想在Haskell中将Maybe Int转换为Int,如下所示:

convert :: Maybe Int -> Int
convert mx = case mx of 
               Just x -> x
              Nothing -> error "error message"

当我编译它时,Haskell告诉我:parse error on input 'Nothing'

我需要这个,因为我想从Data.List模块中使用elem.Index函数获取列表中元素的索引,然后在take函数上使用此索引。我的问题是elemIndex返回Maybe Int,但take需要Int

2 个答案:

答案 0 :(得分:7)

这是一个空白问题。 case子句需要缩进到同一级别。

convert :: Maybe Int -> Int
convert mx = case mx of 
               Just x -> x
               Nothing -> error "error message"

请记住只使用空格,不使用标签。

答案 1 :(得分:2)

要添加@ leftaroundabout的答案,我想我可能会为您提供其他一些选择。

首先,你不应该做出这样不安全的事情:你的程序会失败。将它保持为Maybe Int并且安全地运行它会更加清洁。换句话说,这是一个简单的解析错误,但是制作这样的不完整函数可能会在将来引起更大的问题。

您遇到的问题,我该怎么做?

我们可能会做出更好的功能,例如:

mapMaybe :: (a -> b) -> Maybe a -> Maybe b
mapMaybe f m = case m of
     Just a  -> f a
     Nothing -> Nothing

这将允许你写:

λ> (+ 15) `mapMaybe` Just 9
Just 24

但是,有一个名为fmap的函数,它将某个函数“映射”在某些数据结构上,包括Maybe

λ> (== 32) `fmap` Just 9
Just False

如果您有import ed Control.Applicative,则有一个很好的运算符同义词:

λ> show <$> Just 9
Just "9"

如果您想了解更多有关这些数据结构的信息,我建议您阅读Learn-you a Haskell