我的教授给了我一个例子,使用“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
?
答案 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