我正在写一个(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
答案 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
时,您的真正含义是"对于每个元素,x
,xs
,x `mod` n == 0
"。
让我们写一个谓词来表达关于列表元素的内容:
p x = x `mod` n == 0
现在我们可以使用all
,它接受我们的谓词,并告诉我们列表中的所有元素是否属实。
但是现在我们可能想要在更高的层次上清理一些东西。因为Haskell很懒,所以我们不需要对递归这么明确。我们可以做这样的事情:
bfLCM xs = fromJust $ find SOMETHING [2..]
不幸的是,运行这会导致很多无限循环,因为你的数学实际上有点错误。你能弄清楚你的错误在哪里吗?