You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

逐部分解释:

  1. 原double函数:你已经完成了核心逻辑——对列表每个元素处理:乘2后小于10就直接保留,否则把结果的十位和个位相加(比如5*2=10,处理后得到1+0=1),再递归处理剩余元素。

  2. 使用$操作符的版本:

    • $的核心作用是降低表达式优先级,让右侧表达式先执行,从而避免写大量嵌套括号。
    • sum $ double xs 等价于 sum (double xs):先调用double处理输入列表,再对结果求和。
    • (*9) $ sum $ double xs 等价于 (*9) (sum (double xs)):这里(*9)是一个部分应用的函数(把"乘以9"封装成了单独的函数),它接收求和后的结果并完成最终计算。
  3. 函数组合版本(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] 得到15
  • 15 *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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:20:28