Floating point Can';t将IEEEReal.rounding_模式与real统一

Floating point Can';t将IEEEReal.rounding_模式与real统一,floating-point,integer,type-conversion,sml,Floating Point,Integer,Type Conversion,Sml,为什么我在尝试将实数转换为int时会出错 fun stuff a = Real.toInt a 错误: Error-Can't unify IEEEReal.rounding_mode with real (Different type constructors) Found near stuff (0.0) 也许您忽略了Real.toInt:IEEEReal.rounding\u mode->Real->int,即使用一个额外的参数来指定。如果您不想指定这个额外的参数,例如 fun

为什么我在尝试将实数转换为int时会出错

fun stuff a  =
  Real.toInt a
错误:

Error-Can't unify IEEEReal.rounding_mode with real (Different type constructors) Found near stuff
(0.0)

也许您忽略了
Real.toInt:IEEEReal.rounding\u mode->Real->int
,即使用一个额外的参数来指定。如果您不想指定这个额外的参数,例如

fun round x = Real.toInt IEEEReal.TO_NEAREST x
您可以使用其中一个函数

  • Real.floor:Real->int
    ,假设
    IEEEReal.TO_NEGINF
  • Real.ceil:Real->int
    ,假设
    IEEEReal.TO\u POSINF
  • Real.trunc:Real->int
    ,假定
    IEEEReal.TO_ZERO
    ,或
  • Real.round:Real->int
    假设
    IEEEReal.TO\u最近

有趣的事实:函数
Real.toInt
是。

有时SML是不必要的迂腐。我认为这是其中之一,但事实就是如此。特别是如果你想要转换的真实世界已经以.0结尾。。。但我猜计算机并不知道这一点?@lotolmencre-SML强调语义非常清晰。它是为数不多的真正具有形式语义的语言之一(与结合了不太形式语义的形式语法相反)。这允许编写代码以证明其正确性。作为代价的一部分,它迫使程序员对其他语言中可能被隐藏的东西更加明确。@lotolmencre:在编译时很难知道实数是否以.0结尾。在float和int类型之间动态转换的语言也不需要,它们通常甚至会假设您想要的取整方式。如果你知道这个数字总是以.0结尾,那么就没有理由用实数来表示它,是吗?决定一个实数是否以.0结尾并不完全是件小事。假设它总是以.0结尾,但将其从实数转换为int,听起来像是
real.trunc
的工作。