给定条件查找列表的最后一个元素

Finding the last element of a list given a condition

我正在尝试编写一个函数来查找 Ints 列表的最后一个元素,前提是所有 Ints 都大于 100。这是我到目前为止编写的代码:

isLeast100All :: [Int] -> [Int]
isLeast100All list = filter (>100) list

lastList :: [Integer] -> Integer
lastList list' = case list' of
  isLeast100All list
    | list == []   -> 0
    | list == [x]  -> x
    | list == [x:xs] -> lastList xs

这给了我错误:“模式解析错误:isLeast100All”

我觉得这里缺少一些简单的东西,但我不确定它是什么。我的 lastList 函数基于以下定义:

lastList :: [Integer] -> Integer
lastList x = case x of
  [] -> 0
  [x] -> x
  x:xs -> lastList xs

您需要修正您的类型,并使用 filter 而不是 map 用于 isLeast100All:

isLeast100All :: [Integer] -> [Integer]
isLeast100All = filter (> 100)

lastList :: [Integer] -> Integer
lastList list' = case isLeast100All list' of
    []   -> 0 
    xs  -> last xs

或者只是:

lastList :: [Integer] -> Integer
lastList l = last $ 0 : filter (> 100) l

您对 lastList 的定义存在一些问题。您混淆了 listlist'[x:xs] 应该是 (x:xs),并且您混合了谓词保护和 case ... of 表达式。

这是您可以使用谓词保护定义它的一种方法:

lastList :: [Integer] -> Integer
lastList list' = myLast $ isLeast100All list'

myLast :: [Integer] -> Integer
myLast list
    | list == [] = 0
    | tail list == [] = head list
    | otherwise = myLast $ tail list

这是另一个用例...的:

lastList :: [Integer] -> Integer
astList list' = case isLeast100All list' of
    [] -> 0
    [x] -> x
    (x:xs) -> lastList xs

后者不必要地低效,因为过滤函数 isLeast100All 在每个递归级别都应用于整个剩余列表,但我的目标是使它们尽可能与您的代码相似。

Guru Stron 的回答给出了更简单的选择。