【问题标题】:What is the correct way to use fromIntegral to convert an Integer to real-fractional types?使用 fromIntegral 将 Integer 转换为实小数类型的正确方法是什么?
【发布时间】:2021-03-06 01:56:42
【问题描述】:

我正在尝试使用 fromIntegral 将整数转换为实小数类型。这个想法是有一个辅助方法,以便稍后用于比较 Fraction 的两个实例(它们是否相同)。

我已经阅读了一些相关的文档:

fromIntegral :: (Integral a, Num b) => a -> b
realToFrac :: (Real a, Fractional b) => a -> b

我遇到问题的地方是采用这个概念并实现辅助方法,该方法采用带有分数(分子和分母)的 Num 数据类型并返回我认为是实分数类型值。到目前为止,这是我能够做到的:

data Num = Fraction {numerator :: Integer, denominator :: Integer}

helper :: Num -> Fractional
helper (Fraction num denom) = realToFrac(num/denom)

【问题讨论】:

  • 您可能不想调用您自己的数据类型Num,因为这是 Haskell 库中主要数值 (接口)的名称。跨度>
  • 除非您将此作为练习,否则请注意,基本库中已经有一个 Rational 类型,它定义了相等性并允许转换为任何 Fractional 类型(包括 Double)通过fromRational.

标签: haskell


【解决方案1】:

你需要了解typestype classes的区别。在 OO 语言中,两者是同一个概念,但在 Haskell 中它们不是。

  • 类型包含具体值。例如。 Bool 类型包含值 True
  • 一个类包含类型。例如。 Ord 类不包含任何值,但它确实包含包含可以比较的值的类型。

对于 Haskell 中的数字,您无法从名称中真正分辨出您是在处理类型还是类,这有点令人困惑。 Fractional 是一个类,而 Rational 是一个类型(它是 Fractional 的一个实例,但例如 Float 也是如此)。

在您的示例中...首先让我们给该类型起一个更好的名称

data MyRational = Fraction {numerator :: Integer, denominator :: Integer}

...helper 实际上有两种可能性:转换为具体的Rational

helper' :: MyRational -> Rational

或通用的Fractional-type one

helper'' :: Fractional r => MyRational -> r

后者更一般,因为RationalFractional 的一个实例(即,您实际上可以将helper'' 用作MyRational -> Rational 函数,也可以用作MyRational -> Double 函数)。

无论哪种情况,

helper (Fraction num denom) = realToFrac(num/denom)

不起作用,因为您试图对整数值进行除法,然后才转换结果。相反,您需要将整数转换为小数,然后以该类型进行除法。

【讨论】:

  • 谢谢,我把分数和类型混淆了。而且,我不确定结果类型是什么。但是,Rational 类型非常适合。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 2012-08-16
  • 1970-01-01
  • 1970-01-01
  • 2017-07-29
相关资源
最近更新 更多