Haskell case语句中的分析错误

Haskell case语句中的分析错误,haskell,pattern-matching,type-conversion,parse-error,maybe,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" mapMaybe :: (a -> b) -> Maybe a -> Maybe b mapMaybe f m = case m of

我正在尝试将Haskell中的Maybe Int转换为Int,如下所示:

convert :: Maybe Int -> Int
convert mx = case mx of 
               Just x -> x
              Nothing -> error "error message"
mapMaybe :: (a -> b) -> Maybe a -> Maybe b
mapMaybe f m = case m of
     Just a  -> f a
     Nothing -> Nothing
当我编译它时,Haskell告诉我:
parse error on input'Nothing'


我需要这个,因为我想从Data.list模块中使用elem.Index函数获取列表中元素的索引,然后在take函数中使用这个索引。我的问题是
elemIndex
返回一个
Maybe Int
,但是
take
需要一个
Int
这是一个空白问题。
大小写
子句需要缩进到相同的级别

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

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

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

首先,你不应该做这样不安全的事情:你的程序会失败。将其保持为
可能是Int
并安全地运行会更干净。换句话说,这是一个简单的解析错误,但是生成这样不完整的函数可能会在将来导致更大的问题

你遇到的问题,我怎么做

我们可以制作一个更好的函数,如下所示:

convert :: Maybe Int -> Int
convert mx = case mx of 
               Just x -> x
              Nothing -> error "error message"
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
的函数,它将函数“映射”到某些数据结构上,
可能包括:

λ> (== 32) `fmap` Just 9
Just False
如果您有
import
ed
Control.Applicative
,则有一个很好的操作符同义词:

λ> show <$> Just 9
Just "9"
λ>仅显示9
只有“9”

如果你想更多地了解这些叫做函子的数据结构,我建议你阅读。

也就是说,OP似乎想要的是。@bereal:mhhh。。。我不建议您只使用
。见我对上述问题的评论。(不过,它仍然比转换好。)我希望您理解,以这种方式“转换”并不是一个聪明的想法:您实际上是在颠覆类型系统。只有当您完全确定参数是一个
只是
,但类型检查器无法验证它时,才能执行此操作。即使这样,最好在需要的地方显式匹配{Just x->x}
case mx,而不是通过helper函数。原因是:如果这个匹配失败,它会给你一个清晰的错误消息,告诉你它发生在哪里。无论您在何处使用,当假设失败时,您的
convert
将始终向您提供相同的错误消息。听起来您只需要
takeWhile(/=item)