【问题标题】:how to handle divide by zero error in ML如何处理 ML 中除以零的错误
【发布时间】:2011-12-06 14:46:29
【问题描述】:

我是机器学习新手。

我需要定义一个以条件表达式作为参数的函数,问题是表达式是否像"10 div 0 = 0" 这样无效。我该如何处理?

例如函数定义如下:foo exp1 = if (exp1) then ... else...,而exp1"10 div 0 = 0",这个除法错误如何处理。

【问题讨论】:

  • 您能否在代码块中发布正常语法的样子,以便有人可以尝试帮助您..
  • 例如,如果我要在 C# 中编写代码,我会使用这种类型的语法 inline int roundDownDivide(int a, int b) { if (a >= 0) return a/b;否则返回 (a-b+1)/b; }
  • @DJKRAZE 我更新了我的问题。谢谢

标签: error-handling sml ml divide-by-zero


【解决方案1】:

您好像想问一下SML中的异常处理机制。

当您调用10 div 0 时,SML 基础库中的div 函数会引发 Div 异常。这取决于您是否需要该值来处理异常。在这种情况下,您可以返回 true/false 或选项类型:

(* only catch exception, ignore value *)
fun div_check (x, y) = (
  ignore (x div y);
  false
) handle Div => true

(* catch exception and return option value *)
fun div_check2 (x, y) = (
  SOME (x div y)
) handle Div => NONE

更新:

在这种情况下编译器没有引发Div 异常真的很奇怪。我建议您自己定义一个自定义 div 函数并引发/处理异常:

exception DivByZero;

(* custom div function: raise DivByZero if y is zero *)
infix my_div;
fun x my_div y =
  if y=0 then raise DivByZero else x div y

fun div_check (x, y) = (
  ignore (x my_div y);
  false
) handle DivByZero => true

fun div_check2 (x, y) = (
  SOME (x my_div y)
) handle DivByZero => NONE

【讨论】:

  • 谢谢,看来我在找什么。但是 sml 仍然给我:'./sml: Fatal error -- unexpected fault, signal = 8, code = 0x7' 当我使用像 div_check (10, 0) 这样的函数时。
  • 我检查了 smlnj 并得到了相同的行为。检查我的更新以获取其他解决方案。
  • 这可能是来自特定版本或特定平台的 SML/NJ 错误。我在 OS X 上使用 v110.73 正确提升了 Div
  • @Gian:我也有同样的怀疑,但在互联网上搜索无法验证。感谢您指出。
猜你喜欢
  • 2023-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-28
  • 1970-01-01
  • 1970-01-01
  • 2021-02-24
相关资源
最近更新 更多