首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Haskell浮动到Int到浮动转换错误

Haskell浮动到Int到浮动转换错误
EN

Stack Overflow用户
提问于 2022-11-13 10:53:34
回答 1查看 57关注 0票数 1

我想把a浮点数(0,123456)转换成b(正整数)。我使用截断函数将浮点数舍入到特定长度"b“。

这是我想出的公式,但是我在用GHCI编译时遇到了一个错误。

职能:

代码语言:javascript
运行
复制
calcFloatingNum:: Double -> Int -> Int -> Float
calcFloatingNum a b = truncate ( a * 10^b) /10^b

错误代码:

代码语言:javascript
运行
复制
   * 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

如果我再试一试,它会说:

代码语言:javascript
运行
复制
ghci> calcFloatingNum 0.2345 2

<interactive>:1:1: error:
    Variable not in scope: calcFloatingNum :: t0 -> t1 -> t
ghci>

所以签名可能是问题所在,但我似乎找不到解决办法。

我试着用"fromInteger“和"toInteger”来转换数字,但是它也会导致错误代码。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-13 11:25:33

除了我在评论中提到的事情外,这个问题实际上是一个跟随类型,特别是浮动和整型的练习。

让我们从您试图使用的函数的类型签名开始。我将使用混凝土类型来保持简单。

代码语言:javascript
运行
复制
truncate :: Double -> Int
(^) :: Int -> Int -> Int

正如您所看到的,这些函数产生整数,而您想要浮动。因此,每当我们使用这些函数时,我们都需要使用fromIntegral :: Int -> Double将结果转换回Double

代码语言:javascript
运行
复制
calcFloatingNum:: Double -> Int -> Double
calcFloatingNum a b = 
  fromIntegral (truncate (a * fromIntegral (10 ^ b))) / fromIntegral (10 ^ b)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74420265

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档