Haskell新手咨询:如何将自定义函数结果求和后乘指定数值
解决方法:组合函数实现需求
首先,我们可以直接基于你已有的double函数,通过$操作符或者函数组合来实现你想要的功能。先看完整的代码实现:
-- 你原有的double函数 double :: [Int] -> [Int] double x = case x of [] -> [] x:xs -> (if (x*2 < 10) then [x*2] else [x*2 `div` 10 + x*2 `mod` 10]) ++ double xs -- 用$操作符实现的计算函数 calculate :: [Int] -> Int calculate xs = (*9) $ sum $ double xs -- 更简洁的函数组合版本(无需显式参数) calculate' :: [Int] -> Int calculate' = (*9) . sum . double
逐部分解释:
原
double函数:你已经完成了核心逻辑——对列表每个元素处理:乘2后小于10就直接保留,否则把结果的十位和个位相加(比如5*2=10,处理后得到1+0=1),再递归处理剩余元素。使用
$操作符的版本:$的核心作用是降低表达式优先级,让右侧表达式先执行,从而避免写大量嵌套括号。sum $ double xs等价于sum (double xs):先调用double处理输入列表,再对结果求和。(*9) $ sum $ double xs等价于(*9) (sum (double xs)):这里(*9)是一个部分应用的函数(把"乘以9"封装成了单独的函数),它接收求和后的结果并完成最终计算。
函数组合版本(
calculate'):.是函数组合符,作用是把多个函数串联起来:f . g = \x -> f (g x)。(*9) . sum . double相当于按顺序执行:先跑double处理输入,再把结果传给sum求和,最后把求和结果传给(*9)完成乘法。这个写法更简洁,不需要显式写出参数xs(得益于Haskell的柯里化特性)。
测试示例:
对于输入[1,2,3,4,5]:
double [1,2,3,4,5]返回[2,2,6,4,1]sum [2,2,6,4,1]得到1515 *9最终结果是135
调用calculate [1,2,3,4,5]或者calculate' [1,2,3,4,5]都会得到135。
如果你想要更直观的写法(不用部分应用),也可以写成:
calculate xs = sum (double xs) * 9
不过用$或者.的写法更符合Haskell的函数式风格,当需要组合更多函数时会更清晰。
内容的提问来源于stack exchange,提问作者Car
相关产品推荐
相关产品推荐

