我在过去几天开始学习Haskell,我遇到了这段代码的麻烦.我正在尝试创建一个函数,在给定初始列表(包含至少2个),最大列表长度,当前除数的索引(应从1开始,通过将当前数除以所有测试)的情况下生成素数列表到目前为止的素数)和当前要测试的数字(奇数).
我知道它不是很优雅或高效但是这段代码不会编译或运行所以我想在优化之前先修复它.虽然对此的建议也很酷.
primes = [2,3,5,7,11,13]
genPrimes primes max curDiv curTest
| length primes >= max = primes
| primes !! curDiv > floor . sqrt curTest = genPrimes (primes ++ [curTest]) max 1 (curTest + 2)
| curTest `mod` primes !! curDiv == 0 = genPrimes primes max 1 (curTest + 2)
| curTest `mod` primes !! curDiv /= 0 = genPrimes primes max (curDiv + 1) curTest
Run Code Online (Sandbox Code Playgroud)
当我尝试编译上面的代码时,我收到以下错误:
Couldn't match expected type `a0 -> c0' with actual type `Integer' …Run Code Online (Sandbox Code Playgroud) 我在GHCi中写了一个快速的单行程,并尝试用地图组合总和.我认为它失败的原因是因为map给出了一般类型[b]的输出,而sum则采用特定输入Num a => [a].但是,假设map函数的输出类型为Num b => [b],则此代码没有任何问题.
我认为写一个限制类型声明可能会起作用(虽然我猜这会阻止你在GHCi中这样做)但它仍然没有:
myFunc :: Num b => (a -> b) -> [a] -> b
myFunc = sum . map
Run Code Online (Sandbox Code Playgroud)
给我以下错误:
Couldn't match expected type `[[a] -> b]'
with actual type `[a] -> [b]'
Expected type: (a -> b) -> [[a] -> b]
Actual type: (a -> b) -> [a] -> [b]
In the second argument of `(.)', namely `map'
In the expression: sum . map
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点?也许我只是缺少一些明显的东西(Haskell新手).