【问题标题】:How to pattern match 0.0 in SML? [duplicate]如何在 SML 中模式匹配 0.0? [复制]
【发布时间】:2019-01-19 12:59:53
【问题描述】:

我有以下代码:

datatype complex = RealImg of real * real | Infinity;

fun divisionComplex(RealImg(a, b), RealImg(0.0, 0.0)) = Infinity
fun divisionComplex(RealImg(a, b), RealImg(c, d)) =
    RealImg ((a * c + b * d) / (c * c + d * d), ((b * c) - (a * d))/ (c* c + d * d))

但是它失败了:

Error: syntax error: inserting  EQUALOP

我很困惑。为什么会这样?我知道我无法比较 SML 中的两个实数,但我应该如何与 0 进行模式匹配?

【问题讨论】:

标签: functional-programming sml smlnj


【解决方案1】:

正如你所说,SML 不允许对实数进行模式匹配,但建议改用 Real.== 或将这些数字之间的差异与某个增量进行比较。

如果只使用一个 if 语句呢? (还添加了一些 Infinity 案例,只是为了使与函数参数的匹配详尽无遗,但请随意更改它,因为它不会假装是正确的)

datatype complex = RealImg of real * real | Infinity;

fun divisionComplex(Infinity, _) = Infinity
  | divisionComplex(_, Infinity) = Infinity
  | divisionComplex(RealImg(a, b), RealImg(c, d)) =
    if Real.== (c, 0.0) andalso Real.== (d, 0.0)
    then Infinity
    else
      RealImg ((a * c + b * d) / (c * c + d * d), ((b * c) - (a * d))/ (c* c + d * d))

【讨论】:

  • 谢谢!你知道在没有if then else 声明的情况下匹配它吗?
  • 实数在 sml 中无法匹配,因为它们不精确且不是相等类型
猜你喜欢
  • 2017-06-10
  • 1970-01-01
  • 1970-01-01
  • 2021-09-14
  • 2023-04-05
  • 2021-06-01
  • 1970-01-01
  • 2012-09-13
  • 1970-01-01
相关资源
最近更新 更多