在Haskell过度使用fromIntegral

Ash*_*Ash 27 double haskell integer

每当我使用双精度和整数编写函数时,我发现这个问题,我不断在我的函数中到处使用'fromIntegral'.例如:

import Data.List

roundDouble
    :: Double
    -> Int 
    -> Double
roundDouble x acc = fromIntegral (round $ x * 10 ** fromIntegral acc) / 10 ** fromIntegral acc
Run Code Online (Sandbox Code Playgroud)

有没有更简单的方法来写这个?(我知道可能有更简单的方法来舍入数字,如果有,请告诉我!但我主要感兴趣的是如何避免使用这么多'fromIntegrals'.)

谢谢,阿什

luq*_*qui 24

有时候我发现辅助函数很有用:

roundDouble x acc = (round $ x * 10 ^ acc) /. (10 ^ acc)
    where 
    x /. y = fromIntegral x / fromIntegral y
Run Code Online (Sandbox Code Playgroud)

那个辅助函数也可以写成:

(/.) = (/) `on` fromIntegral
Run Code Online (Sandbox Code Playgroud)

on来自哪里Data.Function.

  • (/.)的类型是(积分a,分数b,积分a1)=> a - > a1 - > b而来自积分的(/)`on`的类型是(分数b,积分a)=> a - > a - > b.如果您需要更通用的类型,则不合适. (6认同)

sep*_*p2k 12

你可以用^而不是**.^将任何积分作为第二个参数,因此您不需要调用fromIntegral第二个操作数.所以你的代码变成:

roundDouble x acc = fromIntegral(round $ x*10 ^ acc)/ 10 ^ acc

其中只有一个fromIntegral.那个你不能round自然地返回积分的那个,你不能在积分上执行非整数除法.


Joh*_*n L 6

我有一个与编组代码类似的问题,其中fromIntegral用于将CInt转换为Int.我通常会定义fI = fromIntegral以使其更容易.您可能还需要为其提供显式类型签名或使用-XNoMonomorphismRestriction.

如果您正在进行大量的数学运算,您可能需要查看数字前奏,这似乎在不同的数字类型之间有更明智的关系.