List 如何根据元组元素的条件在压缩列表中查找索引(Haskell)

List 如何根据元组元素的条件在压缩列表中查找索引(Haskell),list,haskell,zip,List,Haskell,Zip,我是新来的,熟悉Haskell,但不知道如何解决以下问题: 我有一个压缩的(来自Bool和Int列表)元组列表,其中包含(Bool,Int)表单。我如何才能找到(一个)元素的索引,该元素的值True为第一个,而“最小秒数”为第二个?有什么奇特的库函数可以使用吗?因为第一个元素是Bool您可以使用fst对其进行过滤: filter fst l filter (p . fst) l 在更一般的情况下,您将有一个类型a和一个谓词p::a->Bool。然后,您可以使用fst组合p进行过滤: filt

我是新来的,熟悉Haskell,但不知道如何解决以下问题:


我有一个压缩的(来自
Bool
Int
列表)元组列表,其中包含
(Bool,Int)
表单。我如何才能找到(一个)元素的索引,该元素的值
True
为第一个,而“最小秒数”为第二个?有什么奇特的库函数可以使用吗?

因为第一个元素是
Bool
您可以使用fst对其进行过滤:

filter fst l
filter (p . fst) l
在更一般的情况下,您将有一个类型
a
和一个谓词
p::a->Bool
。然后,您可以使用
fst
组合
p
进行过滤:

filter fst l
filter (p . fst) l
现在进入第二步,您希望根据自定义条件找到最小值(与默认的
compare
相反)。这正是数据列表的作用。它需要类型为
(a->a->Ordering)
的比较函数。您可以编写自己的比较函数,但使用from Data.function有更好的方法。要找到第二个元素的最小元素,您可以说:

minimumBy (compare `on` snd)

找到索引只是一个练习。

我猜你的真正目标是找到最小值,你可以在不知道最小值位置的情况下找到它

如果需要处理空列表的情况,那么只需返回一个Maybe类型, 因为空列表的最小值未定义

这里有两种可能性:getMin和getMin2

import Data.List (sortBy, foldl')

head' :: [a] -> Maybe a
head' [] = Nothing
head' (a:as) = Just a

getMin  :: [(Bool, Int)] -> Maybe (Bool, Int)
getMin  vs = head' $ sortBy (\i j -> compare (snd i) (snd j)) $ filter fst vs

getMin2 :: [(Bool, Int)] -> Maybe Int
getMin2 vs = foldl' r Nothing vs where
    r (Just i) (b,j) = case (b, compare j i) of
                          (True, LT) -> Just j
                          otherwise  -> Just i
    r Nothing (b,j)  = case b of
                          True  -> Just j
                          False -> Nothing

Data.List> getMin  [(True, 4), (False, 0), (True, 3)]
Just (True,3)
Data.List> getMin2  [(True, 4), (False, 0), (True, 3)]
Just 3

你尝试了什么?
Data.List
中有几个函数可以帮助实现这一点。第一种方法使用
过滤器
非常简单,第二种方法使用
最小值
非常简单。在这种情况下,
findIndex
似乎比
过滤器
更适合我。或者只需
elemIndex
,假设您已经分别计算了最小值。请注意,将索引放入列表通常是个坏主意(至少它没有效率)。直接基于排序/过滤的解决方案通常更惯用。如果您绝对需要索引,那么您可能应该使用数组而不是列表。