You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在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

火山引擎 最新活动