我对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。如何改进我的代码?
您似乎混合了两种可能的方法来解决这个问题:
-
毫不费力的方法
firstList :: [Integer] -> Integer firstList = head
β-展开CCD_ 1。这只需调用标准的
head
函数,而无需执行任何其他操作。这当然是解决问题的一种方法,但可能不是这项任务所期望的。 -
全手动进近
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返回原始列表的第二个元素