应用Integral和Fractional之间的比较

时间:2015-07-30 21:22:17

标签: haskell

我想检查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类型,通过除以它我打破了函数的刚性类型构造。如何修复我的功能以便编译?

1 个答案:

答案 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]