case 语句中的解析错误

Parse error in a case statement

我正在尝试将 Maybe Int 转换为 Haskell 中的 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 returns 一个 Maybe Int,但是 take 需要一个 Int.

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

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

记住只使用空格,不要使用制表符。

为了补充@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 的函数,它 'maps' 是针对某些数据结构的函数,Maybe 包括:

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

如果您 import 编辑了 Control.Applicative,那么它有一个很好的运算符同义词:

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

如果您想了解更多关于这些称为 Functors 的数据结构,我建议您阅读 Learn-you a Haskell