【问题标题】:Haskell find divisors based on comprehension methodHaskell 基于推导法求除数
【发布时间】:2021-12-26 15:07:52
【问题描述】:

我需要一点帮助来理解一个理解方法函数。

compdivides :: Integer -> [Integer]
compdivides x
    | x > 0 = [a | a <-[1..div x 2], mod x a == 0] ++ [x]
    | otherwise = compdivides (abs x)

我知道如果 x 为正,我们执行第 3 行,否则执行第 4 行。

在第三行中,我们检查 mod x a == 0 是否只有然后我们才执行其他所有操作。

但是,我似乎无法理解这部分a &lt;-[1..div x 2]这里到底发生了什么?

另外,为什么我们最后要这样做 ++ [x] ?我们到底在做什么?

itemTotal :: [(String, Float)] -> [(String, Float)]
itemTotal [] = []
itemTotal [x] = [x]

我也遇到了一些麻烦。 我知道如果列表为空,我们只需返回一个空列表。

但是,我们在这里说什么? itemTotal [x] = [x] 如果列表只有一件事,我们只需返回那一件事?

非常感谢您的帮助!

【问题讨论】:

    标签: haskell functional-programming


    【解决方案1】:

    但是,我似乎无法理解这部分a &lt;-[1..div x 2]这里到底发生了什么?

    这是列表推导式的生成器。列表理解:

    [ a | a <- [1 .. div x 2 ], mod x a == 0 ]
    

    将评估使得a 获取列表中的每个项目(因此1、2、...、x/2),如果mod x a == 0x 可被@整除) 987654326@),它会将a添加到列表中。

    另外,为什么我们在结尾处这样做 ++ [x] ?我们到底在做什么?

    它在列表末尾附加x。这样做是因为一个数字 x 总是可以被自己整除 (x),因为 a &lt;- [1 .. div x 2] 停止在 div x 2,它永远不会检查 x 是否除以 x

    函数将陷入compdivides 0 的无限循环,因此您可能还需要重写函数以涵盖这种情况。

    但是,我们在这里说什么? itemTotal [x] = [x] 如果列表只有一件事,我们只需返回那一件事?

    是的。通常使用像itemTotal (x : xs) = x : itemTotal xs 这样的模式,因此我们返回一个列表,其中x 是第一项,我们在列表的尾部递归xs

    但是,您的 itemTotal 函数只会为前两个子句制作列表的副本。因此,您可以简单地定义itemTotal = id。您可能需要重写函数以确定列表中的项目总数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-28
      • 2016-07-12
      • 2015-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-23
      相关资源
      最近更新 更多