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

时间:2013-11-02 20:41:25

标签: 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 4

我想摆脱这个“Just”。

是否有任何解决方案可以删除Just

4 个答案:

答案 0 :(得分:4)

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

问题是你需要在空列表的情况下返回错误。

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

答案 1 :(得分:4)

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

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

它根据规范工作,因为foldr1需要非空列表。为什么它返回列表中的最后一个元素的直觉可以从观察得到,即foldr1用上面的等式中的lambda替换列表结构中的每个(:),它基本上选择最右边的两个元素。重复,你得到最后一个。

答案 2 :(得分:2)

我认为你的教授意味着你需要最后重新实现Prelude功能 在point-free style

non point-free example:
filterEven xs = filter even xs

point-free     exapmle:
filterEven    = filter even

point-free examples of last:
lastv1 = (head . reverse)
lastv2 = foldl1 (\acc x -> x)
lastv3 = foldr1 (\x acc -> acc)
lastv4 = \(x:xs) -> if null xs then x else lastv4 xs
lastv5 = \e -> case e of
    [x] -> x
    (_:xs) -> lastv5 xs
    otherwise -> error "empty list"

答案 3 :(得分:0)

这是一个可行的解决方案:

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