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)
我已经想出了修改以获得编译代码,但它实际上并没有找到素数.我不得不改变
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是不同的类型).最后,我删除了floor从number在第二后卫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(4是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
Run Code Online (Sandbox Code Playgroud)
但是17是素数!你看到你的算法在哪里做错了吗?
| 归档时间: |
|
| 查看次数: |
125 次 |
| 最近记录: |