给定条件查找列表的最后一个元素
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
的定义存在一些问题。您混淆了 list
和 list'
,[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 的回答给出了更简单的选择。
我正在尝试编写一个函数来查找 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
的定义存在一些问题。您混淆了 list
和 list'
,[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 的回答给出了更简单的选择。