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。
我正在尝试将 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。