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

Check if Int `mod` every element of a list == 0

我正在编写一个(识字)Haskell 代码来暴力破解整数列表的 lcm(最小公倍数)。

我已经想到了一个策略,但是我对 Haskell 语法不是很好,很多函数也不知道。

这是目前的功能:

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

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

第一个调用是 bruteforceLCM xs 2,因为 n=0 不可整除而 n=1 总是 return 为真,这些情况较早通过模式匹配解决。

我必须用什么来代替 "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

你能写出一个函数 f :: Int -> Bool 来检查 Int 是否为 0 模 n 吗?我会把这第一步留给你。

所以现在你有一个函数 f :: Int -> Bool 和一个 Int 的列表,你想看看 f x 是否是每个 xTrue ] 在列表中。我们ask Hoogle, and it tells us about all。您将使用 f 作为 all 的第一个参数来执行您想要的操作。

您的起点是

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

当你说 EVERYELEMENTOFTHELIST `mod` n == 0 时,你真正的意思是 "For each element, x, of xs, x `mod` n == 0"。

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

p x = x `mod` n == 0

现在我们可以使用 all,它接受我们的谓词并告诉我们它是否对列表的所有元素都为真。

但现在我们可能想在更高层次上稍微清理一下。因为 Haskell 是惰性的,所以我们不需要对递归如此明确。我们可以改为这样做:

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

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