在 Haskell 中将两个函数相加

汽车

嗨,我是 Haskell 的新手,我遇到了一个有趣的问题,但我不确定如何解决它。我将仅向您展示问题的两个部分作为示例。

问题是我们要输入一个 13 到 15 位数字之间的数字。然后从该数字中删除最后一个数字。例如 19283828382133 应该输出完全相同的数字,只是没有最后的 3,1928382838213。

然后这些数字中的每个奇数(不是数字)都会加倍。所以你会得到 2,9,4,8​​,6 等

到目前为止,这是我的代码。正如您从代码中看到的,我已经能够单独完成这两部分(工作),但我不确定如何将它们添加在一起。

lastdigit :: Integer -> Integer -- This Function removes the last number
lastdigit x = x`div`10

doubleOdd (x:xs) = (2*x):(doubleEven xs) -- This function doubles every odd digit not number.
doubleOdd [] = []
doubleEven (x:xs) = x:(doubleOdd xs)
doubleEven [] = []

因此,为了进一步解释我正在尝试构建的程序,首先要完成输入 13 到 15 位数字的步骤。然后它将首先删除最后一个数字,然后自动进入下一步将每个奇数(不是数字)加倍。谢谢

瑞吉斯·库卡茨

缺失的部分是一种将整数分解成其数字并从那里重新构建它的方法。这很容易:

digits:: Int -> [Int]
digits = map (`mod` 10) . takeWhile (/= 0) . iterate (`div` 10)

undigits :: [Int] -> Int
undigits = foldr f 0 where f i r = 10 * r + i

然后看起来您需要以两种不同的方式对这些数字进行后处理,但前提是它们与谓词匹配。让我们为此构建一个组合器:

when :: (a -> Bool) -> (a -> a) -> a -> a
when p f a = if p a then f a else a

第一种情况出现在您想在奇数位置(从左到右)上双位数。再次是微不足道的,digits通过增加十的幂分解数字会带来一些不便让我们用每个数字的位置作为前缀:

prefix :: [Int] -> [(Int, Int)]
prefix is = let n = length is in zip [n, n-1..1] is

doubleOdd 现在可以表示为

doubleodd :: [Int] -> [Int]
doubleodd = map (snd . when (odd . fst) (id *** double)) . prefix

您在评论中提到,当双数溢出时,必须将其数字相加。这是我所指的第二种情况,它本身也很简单:

double :: Int -> Int
double = when (>= 10) (sum . digits) . (* 2)

这是你的最终程序:

program = undigits . doubleodd . tail . digits

...假设“13 到 15 位数字之间”部分是单独验证的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何从对列表中将每个对的两个元素相乘-Haskell

来自分类Dev

Haskell高阶函数。传递两个函数作为参数。

来自分类Dev

Haskell:如何使用“两个同名函数”?

来自分类Dev

Haskell从两个列表中绘制函数参数

来自分类Dev

Haskell:使用相同的where子句的两个不同的函数

来自分类Dev

Haskell从两个列表中绘制函数参数

来自分类Dev

Haskell中两个函数的最通用的“乘积”类型

来自分类Dev

Haskell 保护函数未加载,检查两个变量

来自分类Dev

压缩两个函数产生的两个列表(Haskell)

来自分类Dev

Haskell函数由两个二进制函数组成?

来自分类Dev

在Haskell编程中,如何通过交替组合两个函数列表返回函数?

来自分类Dev

在 Haskell 中不使用 + 运算符将两个数字相加

来自分类Dev

haskell函数,将列表的数字相加并相乘

来自分类Dev

haskell fmap。fmap函数,作用于两个函子

来自分类Dev

为什么这两个haskell函数不相等?

来自分类Dev

为什么Haskell中forkIO创建的这两个函数不能一一运行?

来自分类Dev

unfoldr中的lambda函数如何与Haskell中的两个参数一起使用?

来自分类Dev

在odoo中将两个值相加(求和)

来自分类Dev

如何在haskell中添加两个列表?

来自分类Dev

在Haskell中逐点添加两个列表

来自分类Dev

Haskell如果不是,则使用“两个语句”

来自分类Dev

Haskell:连接两个IO字符串

来自分类Dev

具有两个where子句的Haskell方法

来自分类Dev

如何从Haskell的两个列表中提取相同的元素?

来自分类Dev

我如何让两个haskell平台分别工作

来自分类Dev

比较两个列表之间的元素-Haskell

来自分类Dev

传递两个列表时的Haskell类型匹配错误

来自分类Dev

在Haskell中输入两个枚举字段

来自分类Dev

如何加入两个Haskell IO monad

Related 相关文章

  1. 1

    如何从对列表中将每个对的两个元素相乘-Haskell

  2. 2

    Haskell高阶函数。传递两个函数作为参数。

  3. 3

    Haskell:如何使用“两个同名函数”?

  4. 4

    Haskell从两个列表中绘制函数参数

  5. 5

    Haskell:使用相同的where子句的两个不同的函数

  6. 6

    Haskell从两个列表中绘制函数参数

  7. 7

    Haskell中两个函数的最通用的“乘积”类型

  8. 8

    Haskell 保护函数未加载,检查两个变量

  9. 9

    压缩两个函数产生的两个列表(Haskell)

  10. 10

    Haskell函数由两个二进制函数组成?

  11. 11

    在Haskell编程中,如何通过交替组合两个函数列表返回函数?

  12. 12

    在 Haskell 中不使用 + 运算符将两个数字相加

  13. 13

    haskell函数,将列表的数字相加并相乘

  14. 14

    haskell fmap。fmap函数,作用于两个函子

  15. 15

    为什么这两个haskell函数不相等?

  16. 16

    为什么Haskell中forkIO创建的这两个函数不能一一运行?

  17. 17

    unfoldr中的lambda函数如何与Haskell中的两个参数一起使用?

  18. 18

    在odoo中将两个值相加(求和)

  19. 19

    如何在haskell中添加两个列表?

  20. 20

    在Haskell中逐点添加两个列表

  21. 21

    Haskell如果不是,则使用“两个语句”

  22. 22

    Haskell:连接两个IO字符串

  23. 23

    具有两个where子句的Haskell方法

  24. 24

    如何从Haskell的两个列表中提取相同的元素?

  25. 25

    我如何让两个haskell平台分别工作

  26. 26

    比较两个列表之间的元素-Haskell

  27. 27

    传递两个列表时的Haskell类型匹配错误

  28. 28

    在Haskell中输入两个枚举字段

  29. 29

    如何加入两个Haskell IO monad

热门标签

归档