SML 中的函数声明?

Function Declaration in SML?

以下是声明函数的一种方法,我猜(纠正我)&我想使用相同的样式做类似的事情,但它不起作用,为什么?

fun length nil = 0
| length (_::l') = 1 + (length l')

我想在不使用 "case expression of" 语法的情况下执行此操作。即如果函数 x 得到一个数字 3 那么 return 0 否则如果它是 4 那么 1

fun x 3 = 0
| x (4) = 1

Here's the error
stdIn:58.5-59.12 Warning: match nonexhaustive
    3 => ...
    4 => ...

Q2) 另外,函数体从哪里开始?看起来 nil 是一个参数,但我们有 |所以我很困惑!

是带模式匹配的定义,意思和

一样
fun length ls = case ls of
                    nil => 0
                  | _::l' => 1 + (length l')

但更简洁易读。

您的函数收到警告,因为您只匹配 34,没有匹配其他整数。

如果你写

你会得到同样的警告
fun x n = case n of
              3 => 0
            | 4 => 1

匹配所有可能的值将消除警告:

fun x 3 = 0
  | x 4 = 1
  | x _ = 2