我想检查Integral
是否为正方形:
isSquare :: Integral n => n -> Bool
isSquare n = (>1) $ length (filter (\x -> n / x == x) numList)
where numList = reverse [1..n]
除了在列表中迭代是否是正确的方法之外,当我尝试编译此函数时,我得到错误:
No instance for (Fractional Int) arising from a use of ‘/’
我对此的理解是,由于我将n
绑定到Integral
类型,通过除以它我打破了函数的刚性类型构造。如何修复我的功能以便编译?
答案 0 :(得分:4)
您可以将fromIntegral
添加到要获取Fractional
的所有内容:
filter (\x -> fromIntegral n / fromIntegral x == fromIntegral x) numList
或者只是改变数字:
filter (\x -> n == x ^ 2)
此外,您的长度检查不应为>1
。 ==1
会更有意义,但您应该使用null
来避免每次都尝试每个数字(除了首先使用更快的算法)。
isSquare :: Integral a => a -> Bool
isSquare n = not $ null $ filter (\x -> n == x ^ 2) numList
where numList = reverse [1..n]