-1

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

我尝试过这样的事情:如果我的解决方案根据问题陈述有误,请纠正我。

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

4 回答 4

4

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

问题是如果列表为空,您将需要返回错误。

laste :: [a] -> a
laste []     = error "Can't handle empty lists." -- or some other error message
laste [x]    = x
laste (x:xs) = laste xs
于 2013-11-02T21:59:19.300 回答
4

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

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

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

于 2013-11-03T00:49:35.370 回答
2

我认为您的教授的意思是您需要最后以无点样式重新实现 Prelude 功能。

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"
于 2013-11-03T13:24:37.663 回答
0

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

last' :: [a]    -> a
last'    []     =  error "empty"
last'    (x:[]) =  x
last'    (x:xs) =  last' xs
于 2016-06-18T15:04:47.150 回答