项目euler问题3在haskell

0xA*_*xAX 0 haskell project

我是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)

谢谢.

Anu*_*ain 6

您的类型签名将整数值限制为大约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)