如何在SML中编写功能类似Python的列表切片函数
SML 列表切片函数实现
元组参数版本(匹配你提供的初始代码写法)
fun slice(nil, _, _) = [] | slice(ls, x, y) = if y <= 0 then [] else if x > 0 then slice(tl ls, x-1, y-1) else hd ls :: slice(tl ls, 0, y-1)
柯里化参数版本(匹配你提到的Slice x y ls调用形式)
fun slice _ _ nil = [] | slice x y ls = if y <= 0 then [] else if x > 0 then slice (x-1) (y-1) (tl ls) else hd ls :: slice 0 (y-1) (tl ls)
逻辑说明
- 空列表边界:只要输入列表为空,无论起始、结束参数是什么,直接返回空列表
- 结束边界判断:如果结束索引参数
y小于等于0,说明已经取完所有需要的元素,直接返回空列表终止递归 - 跳过前置元素:如果起始索引参数
x大于0,说明当前列表第一个元素不需要纳入结果,跳过当前元素后将x、y各减1,递归处理剩余列表 - 收集结果元素:如果起始索引
x已经降到0,说明当前元素需要纳入结果,将表头元素加入返回值,y减1后递归处理剩余列表
测试验证
- 元组参数调用:
slice ([11, 22, 3, 14, 5, 6], 1, 4),返回结果为[22, 3, 14],符合需求 - 柯里化参数调用:
slice 1 3 [0,1,2,3,4],返回结果为[1,2],符合Python风格切片「左闭右开」的规则
如果你需要匹配你开头提到的
Slice 1 3 [0,1,2,3,4]返回[1,2,3]的效果,只需把判断条件y <= 0改为y < 0即可,此时规则变为「左闭右闭」。
内容的提问来源于stack exchange,提问作者ulysessg
相关产品推荐
相关产品推荐

