我想把a浮点数(0,123456)转换成b(正整数)。我使用截断函数将浮点数舍入到特定长度"b“。
这是我想出的公式,但是我在用GHCI编译时遇到了一个错误。
职能:
calcFloatingNum:: Double -> Int -> Int -> Float
calcFloatingNum a b = truncate ( a * 10^b) /10^b
错误代码:
* No instance for (Integral Double)
arising from a use of `truncate'
* In the first argument of `(/)', namely `truncate (a * 10 ^ b)'
In the expression: truncate (a * 10 ^ b) / 10 ^ b
In an equation for `calcFloatingNum':
calcFloatingNum a b = truncate (a * 10 ^ b) / 10 ^ b
|
10 | calcFloatingNum a b = truncate ( a * 10^b) /10^b
如果我再试一试,它会说:
ghci> calcFloatingNum 0.2345 2
<interactive>:1:1: error:
Variable not in scope: calcFloatingNum :: t0 -> t1 -> t
ghci>
所以签名可能是问题所在,但我似乎找不到解决办法。
我试着用"fromInteger“和"toInteger”来转换数字,但是它也会导致错误代码。
发布于 2022-11-13 11:25:33
除了我在评论中提到的事情外,这个问题实际上是一个跟随类型,特别是浮动和整型的练习。
让我们从您试图使用的函数的类型签名开始。我将使用混凝土类型来保持简单。
truncate :: Double -> Int
(^) :: Int -> Int -> Int
正如您所看到的,这些函数产生整数,而您想要浮动。因此,每当我们使用这些函数时,我们都需要使用fromIntegral :: Int -> Double
将结果转换回Double
calcFloatingNum:: Double -> Int -> Double
calcFloatingNum a b =
fromIntegral (truncate (a * fromIntegral (10 ^ b))) / fromIntegral (10 ^ b)
https://stackoverflow.com/questions/74420265
复制相似问题