我想在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
。
答案 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。