我是Haskell的新手,并尝试从http://projecteuler.net/解决3个问题.
The prime factors of 13195 are 5, 7, 13 and 29.
What is the largest prime factor of the number 600851475143 ?
Run Code Online (Sandbox Code Playgroud)
我的解决方案
import Data.List
getD :: Int -> Int
getD x =
-- find deviders
let deriveList = filter (\y -> (x `mod` y) == 0) [1 .. x]
filteredList = filter isSimpleNumber deriveList
in maximum filteredList
-- Check is nmber simple
isSimpleNumber :: Int -> Bool
isSimpleNumber x = let deriveList = map (\y -> (x `mod` y)) [1 .. x]
filterLength = length ( filter (\z -> z == 0) deriveList)
in
case filterLength of
2 -> True
_ -> False
Run Code Online (Sandbox Code Playgroud)
我尝试运行例如:
getD 13195
> 29
Run Code Online (Sandbox Code Playgroud)
但当我尝试:
getD 600851475143
Run Code Online (Sandbox Code Playgroud)
我得到错误异常:Prelude.maximum:空列表为什么?
谢谢@Barry Brown,我想我必须使用:
getD :: Integer -> Integer
Run Code Online (Sandbox Code Playgroud)
但我得到错误:
Couldn't match expected type `Int' with actual type `Integer'
Expected type: [Int]
Actual type: [Integer]
In the second argument of `filter', namely `deriveList'
In the expression: filter isSimpleNumber deriveList
Run Code Online (Sandbox Code Playgroud)
谢谢.
您的类型签名将整数值限制为大约2 ^ 29.尝试Int改为Integer.
编辑:
我看到你已经意识到你需要使用Integer而不是Int.您需要更改getD和isSimpleNumber的类型,否则您将获得类型不匹配.
通常,如果您遇到类型问题,只需删除类型声明,让Haskell告诉您正确的类型.
Main> :t getD
getD :: Integral a => a -> a
Main> :t isSimpleNumber
isSimpleNumber :: Integral a => a -> Bool
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
957 次 |
| 最近记录: |