我怎样才能sqrt
从Int
.
我这样尝试:
sqrt . fromInteger x
但是类型兼容性会出错。
也许您希望结果Int
也是如此?
isqrt :: Int -> Int
isqrt = floor . sqrt . fromIntegral
您可能想floor
用ceiling
或替换round
。(顺便说一句,这个函数的类型比我给出的更通用。)
使用fromIntegral
:
Prelude> let x = 5::Int
Prelude> sqrt (fromIntegral x)
2.23606797749979
Int
和都是Integer
的实例Integral
:
fromIntegral :: (Integral a, Num b) => a -> b
接受你的Int
(这是 的一个实例Integral
)并“使”它成为Num
.
sqrt :: (Floating a) => a -> a
期望 aFloating
和Floating
继承自Fractional
,继承自Num
,因此您可以安全地传递给sqrt
结果fromIntegral
我认为Haskell Wikibook中的类图在这种情况下非常有用。
请记住,应用程序的绑定比任何其他运算符都更紧密。这包括作曲。你想要的是
sqrt $ fromIntegral x
然后
fromIntegral x
将首先评估,因为隐式应用程序(空格)比显式应用程序($)绑定得更紧密。
或者,如果您想了解合成的工作原理:
(sqrt . fromIntegral) x
括号确保首先评估组合运算符,然后生成的函数是应用程序的左侧。