编写两个函数,返回Haskell中列表的第一个和最后一个元素



我对Haskell很陌生,所以我仍然掌握着一切。我想写两个函数,其中第一个函数取整数列表并返回第一个元素。第二个函数执行相同的操作,但返回最后一个元素。到目前为止,我有

firstList :: [Integer] -> Integer
firstList [] = 0
firstList (_:xs) = head xs
lastList :: [Integer] -> Integer
lastList [] = 0
lastList (_:xs) = (last) xs

lastList函数似乎在工作,但firstList没有。例如,对于列表[3,1,2,4];它返回1而不是3。如何改进我的代码?

您似乎混合了两种可能的方法来解决这个问题:

  1. 毫不费力的方法

    firstList :: [Integer] -> Integer
    firstList = head
    

    β-展开CCD_ 1。这只需调用标准的head函数,而无需执行任何其他操作。这当然是解决问题的一种方法,但可能不是这项任务所期望的。

  2. 全手动进近

    firstList [] = ...
    firstList (x:xs) = ...
    

    在此设置中,您不从库中调用任何内容,而是手动确定如何处理列表的头和尾(如果有的话(。对于firstList,这很简单:您只需要使用head元素,即x。不需要做更多的事情,也不需要调用更多的函数。
    OTOH,对于lastList,您实际上需要做更多的工作。具体来说,正如chi所评论的,你实际上并没有处理1元素的情况,因为你总是去掉head元素,如果有的话。如果这是唯一的元素,那么last就无法使用任何元素。实际上,您应该做的根本不是调用标准函数,而是手动处理所有相关情况,并使用自己的函数递归。

    lastList [] = ...
    lastList [x] = ...
    lastList (_:xs) = lastList xs
    

根据我对这个问题的理解,当给定一个空列表时,您希望two函数返回0,而其他函数分别返回第一个或最后一个元素。

Haskell代码:

firstList :: [Integer] -> Integer
firstList [] = 0
firstList (x:_) = x

在您的代码中,xs是列表的剩余部分,因此head返回原始列表的第二个元素