【问题标题】:Haskell type classes - difference between div and /?Haskell 类型类 - div 和 / 之间的区别?
【发布时间】:2016-09-28 14:25:58
【问题描述】:

当我在Ghci中查询div中缀运算符和/运算符的类型时,我发现div的签名是(div) :: Integral a => a -> a -> a,而/的签名是(/) Fractional a => a -> a -> a。虽然它们完成了几乎相同的事情,但类型类 FractionalIntegral 之间有什么区别?

【问题讨论】:

  • 他们根本不做同样的事情-div 是除以余数,/是...很好的分数除法-想想5 / 2 = 2.5 vs 5 `div` 2 = 2-你能看到区别? - 类之间的区别仅在于 - Integral 是你可以用余数除法的数字,小数是有理数(a/b
  • 现在我明白了.. 谢谢 :-)
  • @Carsten:您能否将其发布为提高知名度的答案?谢谢!

标签: haskell read-eval-print-loop


【解决方案1】:

这些操作之间存在概念上的差异:

  • div 是除以余数(见euclidean domain
  • (/) 是小数除法 - 这是(*)inverse 运算

想想5 / 2 = 2.5 vs 5 `div` 2 = 2

类之间的区别仅此而已

  • Integral 是数字,你可以用
  • 进行余数除法
  • Fractional 用于a/b 形式的类有理数 - 想想1/22/7 等。

确实,如果您将FractionalIntegral 操作(如div(/))混合在一起,这是一个常见问题,就像在prelude 中一样,没有类型是这两个类,因此您最终会得到一个您通常无法评估的类型良好的表达式。

对此的通常修复是使用fromIntegral 转换为您所定位的通用Num 实例。

【讨论】:

    猜你喜欢
    • 2012-12-09
    • 2013-10-05
    • 1970-01-01
    • 2013-11-17
    • 2021-01-12
    • 1970-01-01
    • 1970-01-01
    • 2013-05-19
    • 2015-11-07
    相关资源
    最近更新 更多