私は、次のHaskellコードしているタイプ`のInt予想と一致しませんでした:「整数実際の型と `」が
-- Problem 69
import ProjectEuler
phi :: Integer -> Integer
phi n = n * product [p - 1 | p <- primeDivisors n] `div` product [p | p <- primeDivisors n]
-- primeDivisors n is a list of the prime divisors of n
maxRatio :: (Int, Int, Double) -> (Int, Int, Double) -> (Int, Int, Double)
maxRatio [email protected](_, _, x) [email protected](_, _, y)
| x > y = t1
| otherwise = t2
main = print (foldl
maxRatio
(0, 0, 0.0)
[(n, phi n, ratio) | n <- [2..max], let ratio = fromIntegral n/(fromIntegral (phi n))]
)
where max = 1000
次のエラーを与える:
Couldn't match expected type `Int' with actual type `Integer'
In the expression: n
In the expression: (n, phi n, ratio)
In the third argument of `foldl', namely
`[(n, phi n, ratio) |
n <- [2 .. max],
let ratio = fromIntegral n/(fromIntegral (phi n))]'
私はと疑いますトリプル(0, 0, 0.0)
0のタイプはInt
です。 0
は常にInt
と入力するか、この場合、タイプを推定するghciはInt
ですか?後で、どうすれば強制的にタイプInteger
になるのですか?または、このエラーの原因となる他のものがありますか? phi
の種類は、それがInteger
あるべきと言いながら
明確な説明をいただきありがとうございます。私はそのタイプで '' 0''が多型であると思っていましたが、私のnoobの目はエラーを与えた型推論の他の理由を見ることができませんでした。もちろん、私は 'maxRatio'の明示的な型宣言を見逃しました。 –