Haskell作业:如何定义lastHelper实现返回列表末元素的myLast函数
解决方法
首先明确lastHelper的类型:因为foldr的类型是(a -> b -> b) -> b -> [a] -> b,这里myLast的返回值类型是Maybe a,初始累积值是Nothing(类型Maybe a),所以lastHelper的类型应为:
lastHelper :: a -> Maybe a -> Maybe a
接下来是lastHelper的几种等价实现:
写法一:模式匹配
lastHelper x Nothing = Just x lastHelper x (Just y) = Just y
写法二:case表达式
lastHelper x acc = case acc of Nothing -> Just x Just _ -> acc
写法三:用maybe函数简化
lastHelper x = maybe (Just x) id
写法四:用<|>操作符(需导入Control.Applicative)
import Control.Applicative lastHelper x acc = acc <|> Just x
工作原理
foldr从列表右端开始遍历:
- 空列表时,
foldr直接返回初始值Nothing,符合要求。 - 非空列表时,最右侧元素先被处理,此时累积值是初始的
Nothing,lastHelper返回Just x(x为最后一个元素)。 - 左侧元素处理时,累积值已经是
Just包裹的最后一个元素,lastHelper直接返回该累积值,不会替换正确结果。
内容的提问来源于stack exchange,提问作者coderodde
相关产品推荐
相关产品推荐

