如何在Standard ML中用模式匹配实现sub1函数?
解决SML模式匹配函数的语法错误问题
嘿,问题根源很简单——你给函数起的名字sub1.2不符合SML的语法规则!SML里的标识符(包括函数名)只能由字母、数字、下划线组成,而且不能以数字开头,小数点是用来引用模块成员的(比如List.hd),所以编译器会把sub1.2误解析成sub1 * 2,这才抛出了那些语法错误提示。
正确的模式匹配写法
把函数名改成合法的标识符(比如直接叫sub1,或者sub1_v2),然后用模式匹配实现就没问题了:
fun sub1 [] = [] | sub1 (n::ns) = n :: sub1 ns;
为什么这个写法能工作?
这个版本和你最初用if实现的sub1完全等价:
- 第一个模式
[]匹配空列表,对应原代码里null ns then []的逻辑,直接返回空列表; - 第二个模式
(n::ns)匹配非空列表,把列表的头部绑定到n,尾部绑定到ns,对应原代码里(hd ns) :: (sub1 (tl ns))的逻辑,递归处理尾部后再把头部拼接回去。
测试一下这个函数,比如调用sub1 [1,2,3],会返回[1,2,3],和原函数的行为一致。
内容的提问来源于stack exchange,提问作者user11460387




