2

我对 Haskell 中的不同类型有一些问题,我该如何解决?

无法将预期类型Integer与实际类型匹配Int -> t0 -> t0

谢谢

isPrime :: Int -> Bool
isPrime number
    | (number == 1) || (number == 2) = True
    | even number = False
    | otherwise = checkDiv number (fromInteger (`sqrt` number))

checkDiv :: Int -> Int -> Bool
checkDiv number divisor 
    | number == 2 = True
    | (floor number `mod` divisor) == 0 = False
    | otherwise = checkDiv number $ divisor - 1
4

1 回答 1

7

我已经找到了让代码编译的修改,但它实际上并没有找到素数。我不得不改变

fromInteger (`sqrt` number)

floor $ sqrt $ fromIntegral number

函数名周围的反引号是将其转换为各种中缀“运算符”,因此您可以这样做

mod x y

或者

x `mod` y

但不是

`mod` x y

接下来,您使用fromInteger了而不是s fromIntegral,它适用于Ints (Int并且Integer是不同的类型)。最后,我删除了的第二个守卫中的floorfrom ,因为它已经是一个.numbercheckDivnumberInt

isPrime :: Int -> Bool
isPrime number
    | (number == 1) || (number == 2) = True
    | even number = False
    | otherwise = checkDiv number (floor $ sqrt $ fromIntegral number)

checkDiv :: Int -> Int -> Bool
checkDiv number divisor
    | number == 2 = True
    | (number `mod` divisor) == 0 = False
    | otherwise = checkDiv number $ divisor - 1

因此,让我们检查您的代码,以便您了解发生了什么。如果我要计算checkDiv 17 4( 4is floor $ sqrt $ fromIntegral 17),它将执行

checkDiv 17 4
    | 17 == 2            No
    | 17 `mod` 4 == 0    No
    | otherwise = checkDiv 17 (4 - 1) = checkDiv 17 3

checkDiv 17 3
    | 17 == 2            No
    | 17 `mod` 3 == 0    No
    | otherwise = checkDiv 17 (3 - 1) = checkDiv 17 2

checkDiv 17 2
    | 17 == 2            No
    | 17 `mod` 2 == 0    No
    | otherwise = checkDiv 17 (2 - 1) = checkDiv 17 1

checkDiv 17 1
    | 17 == 2            No
    | 17 `mod` 1 == 0    Yes    = False

不过17是素数!你看到你的算法在哪里做错了吗?

于 2013-10-11T16:12:51.990 回答