首页 > 解决方案 > isSquareNumber 函数的 Haskell 类型声明问题

问题描述

我必须编写一个函数来确定一个数字是否是一个完美的正方形,我能够做到:

isSquareNumber x
    | x < 0 = False
    | otherwise = snd (properFraction (sqrt x)) == 0.0

但我必须使用给定的类型声明:isSquareNumber :: Int -> Bool

Whitout 它,它工作正常,但是当我添加它时,我得到了错误。

标签: haskellsqrttype-declaration

解决方案


sqrt :: Floating a => a -> a不适用于 an Int,但适用于Floating类型,并且 anInt不是Floating类型。

您可以使用fromIntegral :: (Integral a, Num b) => a -> bIntegral类型转换为任何Num类型。因此,您可以将其实现为:

isSquareNumber :: Int -> Bool
isSquareNumber x = x >= 0 && f == 0.0
    where (_, f) = properFraction (sqrt (fromIntegral x))

推荐阅读