我有以下Haskell代码:
two :: Integer -> Integer
two i = toInteger(2 ** i)
Run Code Online (Sandbox Code Playgroud)
为什么不工作?
(**)
需要基于函数签名的浮点输入:
(**) :: 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)