Haskell:创建列表中每个列表的最后一个元素的列表

joe*_*el4 1 haskell list pattern-matching

我需要在Haskell中定义函数,对于给定的列表列表,该函数将创建其最后一个元素的列表。例如[[1,2],[3,4]]它应该返回[2,4]

我尝试使用模式匹配,但ite只返回最后一个列表:

lastElement :: [[a]] -> [a]
lastElement [] = error "error"
lastElement [x] = x
lastElement (x:xs) = lastElement xs
Run Code Online (Sandbox Code Playgroud)

它给我 [3,4]

Lor*_*nzo 6

问题

您处在正确的轨道上,问题在于您的代码没有递归。列表上的递归函数通常采用以下形式

f :: [a] -> [b]
f [] = y
f (x:xs) = y : f xs
Run Code Online (Sandbox Code Playgroud)

经过y评估,该结果被“ :ed”到递归调用。现在尝试使您的代码类似。还要注意,您不需要这种lastElement [x]情况,它只是递归的冗余。但是,这仅将某些功能应用于每个元素。您还需要一个函数f :: [a] -> a来从一个列表中获取最后一个元素。到目前为止,您的函数可以做到这一点,但是有一个标准的库函数。看看Hoogle:您可以按类型或说明搜索库函数

更好的选择

在这种情况下,我将使用列表理解,因为我认为阅读起来会更清楚。也看一看

最佳选择

Haskell是一种功能性语言,它使您可以更多地考虑需要对数据进行哪些更改,而不是需要执行哪些步骤。如果您知道它们,则可以为此使用更高阶的函数。特别是功能map :: (a -> b) -> [a] -> [b]。您可以从该类型定义中猜出map一个函数,并将其应用于列表的每个元素。您似乎已经知道该last功能,因此可以使用它:

lastElements :: [[a]] -> [a]
lastElements = map last
Run Code Online (Sandbox Code Playgroud)

看一下这段代码多么简洁明了。无需考虑递归的作用,您只需看到它采用了每个列表的最后一个元素。