使用'**'时没有(浮动整数)的实例?

Zhi*_*ANG 0 haskell

我有以下Haskell代码:

two :: Integer -> Integer
two i = toInteger(2 ** i)
Run Code Online (Sandbox Code Playgroud)

为什么不工作?

shr*_*t18 6

(**) 需要基于函数签名的浮点输入:

(**) :: Floating a => a -> a -> a
Run Code Online (Sandbox Code Playgroud)

toInteger 另一方面,需要输入本质上是不可或缺的:

toInteger :: Integral a => a -> Integer
Run Code Online (Sandbox Code Playgroud)

因此,您无法以两种方式使用它.也就是说,因为你似乎期待整数输入,你可以考虑使用(^),如下:

two :: Integer -> Integer
two i = 2 ^ i
Run Code Online (Sandbox Code Playgroud)

正如@leftaroundabout在评论中正确指出的那样,(^)对于负值会失败i.这可以通过以替代方式检查值和处理来解决,如下所示:

two :: Integer -> Integer
two i = if i > 0 then 2 ^ i else floor (2 ** fromIntegral i)
Run Code Online (Sandbox Code Playgroud)