Haskell中的类型问题

msi*_*erc 2 haskell types casting

我对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
Run Code Online (Sandbox Code Playgroud)

bhe*_*ilr 7

我已经想出了修改以获得编译代码,但它实际上并没有找到素数.我不得不改变

fromInteger (`sqrt` number)
Run Code Online (Sandbox Code Playgroud)

floor $ sqrt $ fromIntegral number
Run Code Online (Sandbox Code Playgroud)

函数名称周围的反引号表示法是将其转换为各种类型的中缀"运算符",因此您可以执行此操作

mod x y
Run Code Online (Sandbox Code Playgroud)

要么

x `mod` y
Run Code Online (Sandbox Code Playgroud)

但不是

`mod` x y
Run Code Online (Sandbox Code Playgroud)

接下来,您正在使用fromInteger而不是fromIntegral,这是在Ints 上工作的(Int并且Integer是不同的类型).最后,我删除了floornumber在第二后卫checkDiv,因为number已经是一个Int.

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
Run Code Online (Sandbox Code Playgroud)

因此,让我们通过您的代码,以便您可以看到正在发生的事情.如果我要计算checkDiv 17 4(4floor $ 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
Run Code Online (Sandbox Code Playgroud)

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