【发布时间】:2013-01-25 05:20:32
【问题描述】:
假设我有一个函数,它在满足给定条件时返回某个值,而在不满足条件时不返回任何值。
例如
fun foo(n)= if n
我最初想写 () 但它表示 if 或某事的两个条件不匹配。
变得更加明确,我想编写一个函数,它接受一个数字,任何数字,如果它是有效整数则组合成一个列表,如果它不是整数则忽略它。
【问题讨论】:
假设我有一个函数,它在满足给定条件时返回某个值,而在不满足条件时不返回任何值。
例如
fun foo(n)= if n
我最初想写 () 但它表示 if 或某事的两个条件不匹配。
变得更加明确,我想编写一个函数,它接受一个数字,任何数字,如果它是有效整数则组合成一个列表,如果它不是整数则忽略它。
【问题讨论】:
在 SML 中,函数总是必须返回一个值¹。表示可能有也可能没有有用结果的函数的一种方法是使用OPTION 类型。使用OPTION,您的函数将返回SOME value,如果它有一些有用的返回,或者NONE,如果没有。
对于您的特定用例,另一种选择是将列表作为第二个参数,然后返回预先添加到列表的结果或未更改的列表。
¹ 事实上,我不知道有任何语言允许非 void 函数不返回值(不调用未定义的行为)。在某些语言中,您可以返回 null 来代替正确的返回值,但在大多数语言中,对于返回类型为 int 的函数是不允许的。无论哪种方式,SML 都没有空值。
【讨论】:
fun foo n = if n < 1000000 then SOME n else NONE
请注意,您不能直接将 foo n 用作整数,但您必须使用 isSome 和 valOf 或模式匹配才能知道您是哪种情况。
将您的列表作为参数传递并将值附加到它可能会更好。
fun foo (n: int, xs: int list) =
if n < 1000000 then n :: xs else xs
【讨论】: