在Module的SML签名中添加变量类型绑定有什么影响?
What is the effect of adding a variable type binding in signature in SML on the Module?
在下面的代码中:
signature DIGIT =
sig
type digit
val make_digit : int -> digit
val increment : digit -> digit
val decrement : digit -> digit
val down_and_up : digit -> digit
val test : digit -> unit
end
structure Digit :> DIGIT =
struct
type digit = int
exception BadDigit
exception FailTest
fun make_digit i = if i < 0 orelse i > 9 then raise BadDigit else i
fun increment d = if d=9 then 0 else d+1
fun decrement d = if d=0 then 9 else d-1
val down_and_up = increment o decrement (* recall o is composition *)
fun test d = if down_and_up d = d then () else raise FailTest
end
I 运行 Digit.test 10;
在 SML 编译器中针对两种不同的情况,在上述代码中 type digit
行:
- 在
type digit
的情况下:
Error: operator and operand don't agree [overload conflict]
operator domain: Digit.digit
operand: [int ty]
- 在
type digit = int
的情况下:uncaught exception FailTest
我的问题很简单,当我们插入 = int
使得 output/error 不同时有什么区别?
第一个是类型错误,因为您没有指定此结构中的 digit
类型。
第二个引发异常作为运行时错误,因为 increment (decrement 10)
为 0。
(我认为这是一个设计问题,您可以将任何函数与任何 int
一起使用,而不仅仅是 make_digit
验证过的东西。)
在下面的代码中:
signature DIGIT =
sig
type digit
val make_digit : int -> digit
val increment : digit -> digit
val decrement : digit -> digit
val down_and_up : digit -> digit
val test : digit -> unit
end
structure Digit :> DIGIT =
struct
type digit = int
exception BadDigit
exception FailTest
fun make_digit i = if i < 0 orelse i > 9 then raise BadDigit else i
fun increment d = if d=9 then 0 else d+1
fun decrement d = if d=0 then 9 else d-1
val down_and_up = increment o decrement (* recall o is composition *)
fun test d = if down_and_up d = d then () else raise FailTest
end
I 运行 Digit.test 10;
在 SML 编译器中针对两种不同的情况,在上述代码中 type digit
行:
- 在
type digit
的情况下:
Error: operator and operand don't agree [overload conflict]
operator domain: Digit.digit
operand: [int ty]
- 在
type digit = int
的情况下:uncaught exception FailTest
我的问题很简单,当我们插入 = int
使得 output/error 不同时有什么区别?
第一个是类型错误,因为您没有指定此结构中的 digit
类型。
第二个引发异常作为运行时错误,因为 increment (decrement 10)
为 0。
(我认为这是一个设计问题,您可以将任何函数与任何 int
一起使用,而不仅仅是 make_digit
验证过的东西。)