检查 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
是否是每个 x
的 True
] 在列表中。我们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..]
不幸的是,运行这会导致很多无限循环,因为你的数学实际上有点错误。你能找出你的错误在哪里吗?
我正在编写一个(识字)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
是否是每个 x
的 True
] 在列表中。我们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..]
不幸的是,运行这会导致很多无限循环,因为你的数学实际上有点错误。你能找出你的错误在哪里吗?