在Haskell中获取Num数组的索引

时间:2013-11-03 14:01:37

标签: list haskell indexing

我需要获取类型为Array Int Int的may数组中元素的位置。我找到了方法elemIndexfind来获取该位置。我的问题是,我不需要前缀Just 5。那么我如何在我的例子中得到数字5

2 个答案:

答案 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,以及ab的函数,将返回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时元素将在列表中的某个位置,那么可以使用fromJustfromJust会盲目地尝试从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
相关问题