Haskell:将Integers除法转换为Double的不同方法

时间:2015-11-11 10:49:24

标签: haskell

假设我想将5(整数)除以3(整数),我希望我的答案是Double。在Haskell中有什么不同的方法可以做到这一点?

2 个答案:

答案 0 :(得分:3)

最常见的方法是将Integer s转换为Double然后将它们分开。您可以通过fromIntegral :: (Integral a, Num b) => a -> b执行此操作,Integer采用类似整数类型的任何值(例如Double)并将其转换为任何类似数字的类型(例如let five, three :: Double five = fromIntegral (5 :: Integer) three = fromIntegral (3 :: Integer) in five / three )。

fromIntegral = fromInteger . toInteger

请注意toInteger,其中IntegraltoInteger类的一部分(Integer,将类似整数的类型的值转换为相应的fromInteger值),NumfromInteger类的一部分(IntegerInteger值转换为任意数字类型的值。在这种情况下,由于您已经拥有fromInteger值,因此可以使用fromIntegral代替Rational

一种不太常见的方法是以某种方式创建let five, three, fiveThirds :: Rational five = toRational (5 :: Integer) three = toRational (3 :: Integer) fiveThirds = five / three in fromRational fiveThirds 数字并将其转换为:

Rational

创建Ratio的另一种方式(以某种方式)取决于您正在使用的标准。如果您已导入Data.Ratio(Haskell 98)或(%) :: (Integral a) => a -> a -> Ratio a(Haskell 2010),您还可以使用let five, three :: Integer fiveThirds :: Rational five = 5 three = 3 fiveThirds = five % three in (fromRational fiveThirds :: Double) 运算符:

[StructLayout(LayoutKind.Explicit)]
struct IndexEntry {
    [FieldOffset(0)]
    public byte key;

    [FieldOffset(4)]
    public int lastValueIdx;

    [FieldOffset(8)]
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = Constants.PART_ENTRY_SIZE)]
    public long[] values;
}

答案 1 :(得分:0)

(/) :: Fractional a => a -> a -> a 的类型签名是:

Double

这意味着,如果您想从/获得fromIntegral,则需要提供双打,而不是整数。因此,我建议使用fromIntegral (5 :: Integer) / fromIntegral (2 :: Integer) == 2.5 之类的函数,如下所示:

            var tabItem = new TabItem();
            tabItem.Header = "My Tab Header";
            tabItem.Content = new UserControl1();
            MainTabControl.Items.Add(tabItem);