Haskell-如何获取列表中元素的索引?

我想获取列表中的elem索引?不是Int,只有Int。

>elemIndex 'f' "BarFoof"
>Just 6

但需要6

smwsmwsmw 回答:Haskell-如何获取列表中元素的索引?

您可以使用fromMaybe :: a -> Maybe a -> aJust中解开该值,并进一步添加一个默认值,以防它是Nothing

因此您可以实现一个功能:

import Data.Maybe(fromMaybe)

elemIndex' :: Eq a => a -> [a] -> Int
elemIndex' x = fromMaybe (-1) . elemIndex x

如果找不到该元素,它将在此处返回-1。例如:

Prelude Data.Maybe Data.List> elemIndex' 'f' "BarFoof"
6
Prelude Data.Maybe Data.List> elemIndex' 'q' "BarFoof"
-1

话虽如此,在Haskell中,Maybe通常用于表示可能“失败”的计算,因此,如果对结果进行后处理,则将采用Nothing(在列表中找到)。

,

正如Willem Van Onsem所说,您可以使用fromMaybe。但是,还有其他选项可能更适合您的特定用例。 (不过,从您的代码中尚不清楚用例是什么,所以我只列出一些选项。)

如果您确定,您要查找的值将位于列表中的某个位置,通常是因为您已使用某种折叠方式将其从同一列表中拉出,您可以使用fromJustfromJustfromMaybe相似,不同之处在于它不使用附加的第一个参数作为后备值,并且如果该值不在列表中,则会抛出错误。人们会争论您是否应该使用可能引发错误的函数(这些函数称为“部分函数”,因为它们仅处理输入域的一部分),因为它们在假设被证实时确实会引起麻烦。是错误的,但是在受到严格控制的情况下可能会有用。

fromJust (Just 10)
> 10

fromJust Nothing
> *** Exception: Maybe.fromJust: Nothing

根据程序的语义,更改函数签名以返回Maybe whatever而不是whatever可能更惯用。在这种情况下,您应该考虑使用fmap>>=<$>之类的东西来传递您的价值,而无需拆开它。我无法告诉您这是否是适合您程序的正确方法,特别是在没有看到更多代码的情况下,但是对于大多数用例,fromMaybe不是正确方法。

fmap (+ 5) (Just 10)
> Just 15

fmap (+ 5) Nothing
> Nothing

Just 10 <$> (+ 5)
> Just 15

Nothing <$> (+ 5)
> Nothing

Just 10 >>= (\x -> if even x then Just $ x `div` 2 else Nothing)
> Just 5

Just 5  >>= (\x -> if even x then Just $ x `div` 2 else Nothing)
> Nothing

Nothing >>= (\x -> if even x then Just $ x `div` 2 else Nothing)
> Nothing

使用-1之类的值指示失败意味着您程序的其余部分需要知道-1指示失败状态。通常,需要将这些类型的故障值与正常返回值分开处理,这正是Maybe类型旨在使之更加美观的用例。是否应该解开Maybe的快速测试是查看并查看程序中是否有任何要进行模式匹配的位置(或使用防护或ifcase等)。 。)尝试在其他地方捕获此-1来触发专门的行为。如果是这样,则不应该解包Maybe(在此)。

本文链接:https://www.f2er.com/3086133.html

大家都在问