检查Int`mod`列表中的每个元素是否== 0

时间:2015-01-04 15:53:06

标签: haskell

我正在写一个(Literate)Haskell代码,它强制执行Ints列表中的lcm(最不常见的多个)。

我已经考虑过一个策略,但是我对Haskell语法不太了解,并且不了解很多函数。

这是迄今为止的功能:

> bruteforceLCM :: [Int] -> Int -> Int
> bruteforceLCM xs n = if EVERYELEMENTOFTHELIST `mod` n == 0
>                        then n
>                        else (bruteforceLCM xs (n+1))

其中xs是所有Ints的列表,n是检查为lcm的当前Int。

第一个调用是bruteforceLCM xs 2,因为n = 0不可分,n = 1总是返回true,这些情况先前用模式匹配解决。

为了实现我的目标,我需要更换“EVERYELEMENTOFTHELIST”?

问候,乔

编辑:现在是完整的代码,感谢dfeuer!

> bruteforceKGV :: [Int] -> Int -> Int
> bruteforceKGV xs n = if all p xs then n else (bruteforceKGV xs (n+1))
>   where p x = n `mod` x == 0

2 个答案:

答案 0 :(得分:3)

你能写下一个函数f :: Int -> Bool来检查Int是否为0模?我将第一步留给你。

现在你有一个函数f :: Int -> Bool和一个Int列表,你想知道f x是否True对于每个x来说是f列表。我们ask Hoogle,它告诉我们all。您将all用作{{1}}的第一个参数来做您想做的事。

答案 1 :(得分:1)

您已经开始

bruteforceLCM :: [Int] -> Int -> Int
bruteforceLCM xs n = if EVERYELEMENTOFTHELIST `mod` n == 0
                       then n
                       else (bruteforceLCM xs (n+1))

当您说EVERYELEMENTOFTHELIST `mod` n == 0时,您的真正含义是"对于每个元素,xxsx `mod` n == 0"。

让我们写一个谓词来表达关于列表元素的内容:

p x = x `mod` n == 0

现在我们可以使用all,它接受​​我们的谓词,并告诉我们列表中的所有元素是否属实。

但是现在我们可能想要在更高的层次上清理一些东西。因为Haskell很懒,所以我们不需要对递归这么明确。我们可以做这样的事情:

bfLCM xs = fromJust $ find SOMETHING [2..]

不幸的是,运行这会导致很多无限循环,因为你的数学实际上有点错误。你能弄清楚你的错误在哪里吗?