我需要获取类型为Array Int Int
的may数组中元素的位置。我找到了方法elemIndex
或find
来获取该位置。我的问题是,我不需要前缀Just 5
。那么我如何在我的例子中得到数字5
?
答案 0 :(得分:7)
要安全地从Maybe a
值中提取值,您可以使用模式匹配,如下所示:
case elemIndex 'C' list of
Just n -> "You can find C at position " ++ show n
Nothing -> "There is no C in the list."
这将返回类似
的内容"You can find C at position 2"
或
"There is no C in the list."
取决于列表中是否有C。
当然,这种模式匹配总是难以编写,因此存在一个名为maybe
的函数,它几乎完全相同。如果你查看它的类型签名,你会看到
maybe :: b -> (a -> b) -> Maybe a -> b
因此需要"默认值"类型b
,以及a
到b
的函数,将返回b
。这是否为默认值取决于Maybe a
值是否存在或是Nothing
。例如,如果您想检查是否允许列表元素进入18+俱乐部,您可以执行
maybe False (\n -> n >= 18) (elemIndex 'C' list)
如果索引小于18 或,如果列表中不存在该元素,则会显示False。如果它确实存在,它将检查它是否大于或等于18,然后返回True。
Just
到目前为止,我告诉你的是如何以安全的方式摆脱Just
。有时候,你现在还不能摆脱Just
- 有时你没有明智的价值来回复如果你手上有Nothing
而不是Just
。你可以做的是当它们仍在Just
内时操纵值。例如,要从just中的值中减去15,只需执行
fmap (subtract 15) (Just 23)
将返回
Just 8
因此,您了解fmap
如何获取Just something
值并将该函数应用于something
部分,并将Just
保留在外。如果你愿意的话
fmap (subtract 15) Nothing
它会保留Nothing
,因此结果将是
Nothing
Maybe
很棒,因为它是一个错误处理系统,迫使你做正确的事情。您无法忽略错误的可能性(由Nothing
表示。)另一个常见的错误处理系统很糟糕。该系统是例外系统。没有人会知道你是否公然忽视可能发生的异常,这是非常不安全的程序的基础。
所以你真的希望保留Just
,直到你可以把它扔掉并同时用合理的东西替换潜在的Nothing
值
如果您保证 没有 Nothing
值的可能性。如果您确定每次调用elemIndex
时元素将在列表中的某个位置,那么可以使用fromJust
。 fromJust
会盲目地尝试从Just
中取出一个值,而不会在没有Just
的情况下发生什么事情。如果出现问题,fromJust
只会爆炸你的程序(抛出异常)。
如您所知,您必须非常小心地使用它。
然而,正如Jedai在评论中指出的那样,即使你不能获得Nothing
值,最好明确一点。不要使用fromJust
,而应考虑执行类似
fromMaybe (error "The input " ++ show list ++ " shouldn't create a Nothing value!")
(elemIndex 'C' list)
会爆炸出一个非常具体的错误信息,指出某些地方一定出错了。
这当然与看起来像
的模式匹配相同case elemIndex 'C' list of
Just n -> n
Nothing -> error "The input " ++ show list ++ " shouldn't create a Nothing value!"
仅限于标准fromMaybe
函数。
答案 1 :(得分:2)
使用Data.Maybe
中的fromJust
。像:
fromJust $ elemIndex 2 [1,2,3,4,5]
你只能获得1
。
但是,如果您在列表中没有所需元素并且您将获得例外,则会失败:
*** Exception: Maybe.fromJust: Nothing