如何使用haskell中的函数返回列表中的最后一个元素?

如何使用haskell中的函数返回列表中的最后一个元素?,haskell,Haskell,我的教授给了我一个使用laste函数获取列表中最后一个元素的示例: 他说:“laste xs=…”形式的定义是不可接受的,而“laste=…”形式的定义是可接受的 我试过这样的方法:根据问题陈述,如果我的解决方案错误,请纠正我 laste :: [a] -> Maybe a laste [] = Nothing laste (x:[]) = Just x laste (x:xs) = laste xs 但这给了我答案,例如: ghci>laste[1,2,3,4] Just

我的教授给了我一个使用laste函数获取列表中最后一个元素的示例: 他说:“laste xs=…”形式的定义是不可接受的,而“laste=…”形式的定义是可接受的

我试过这样的方法:根据问题陈述,如果我的解决方案错误,请纠正我

laste :: [a] -> Maybe a 
laste [] = Nothing 
laste (x:[]) = Just x 
laste (x:xs) = laste xs
但这给了我答案,例如:

ghci>laste[1,2,3,4]
Just 4
我只是想把它处理掉


有什么方法可以删除吗?

您需要更改函数的签名以返回简单元素

问题是,如果列表为空,则需要返回一个错误

laste :: [a] -> a
laste []     = error "Can't handle empty lists." -- or some other error message
laste [x]    = x
laste (x:xs) = laste xs

虽然Charmini2的答案在功能上是正确的,但它并不能解决以无点形式检索最后一个元素的问题。考虑

laste :: [a] -> a
laste = foldr1 (\_ a -> a)

它根据规范工作,因为foldr1需要一个非空列表。它返回列表中最后一个元素的原因可以从以下观察得到:foldr1用上面等式中的lambda替换列表结构中的every:,这基本上选择了两个元素中最右边的一个。重复一遍,你会得到最后一个。

我想你的教授的意思是你需要在最后重新实现前奏功能 在一个小时内


以下是一个可能的工作解决方案:

last' :: [a]    -> a
last'    []     =  error "empty"
last'    (x:[]) =  x
last'    (x:xs) =  last' xs

请参阅fromJust函数:。或者,只需删除构造函数,让x=laste[1,2,3,4]作为它的一个可能的副本,看起来你的家庭作业就是用无点格式来表达它。您的定义很好,但现在不需要这样表达,而是需要将其表达为其他函数的组合,其中一些函数可能需要定义。我想消除这个问题-您希望laste[]返回什么?可以接受laste=last形式的定义吗?
last' :: [a]    -> a
last'    []     =  error "empty"
last'    (x:[]) =  x
last'    (x:xs) =  last' xs