所以对于这三个操作的,你似乎已经定义帮手函数执行的操作背后的逻辑。除此之外,除了修正这种逻辑以使其起作用外,还将这些功能拼接在一起形成功能execute_ops
。
如果这些值同时值构造你的数据类型的您不能命名功能insert
,delete
和setsize
。简单地说,一旦定义了数据类型,然后定义了同一个作用域中的函数,这些函数就会影响值构造函数,并且使您无法表示类型为的列表list_op。
重要的,我怀疑混淆的一点是,insert
,delete
和setsize
不是执行列表上的操作的函数。他们是值构造,就像leaf
和node
是用于制作二叉树:
datatype tree = leaf | node of tree*int*tree
在insert
比较pos=h
没有意义。列表中的元素与他们的位置不同。你希望在位置pos
插入X,不就是等于pos
的第一要素。值不一定等于它在其中出现的列表中的位置。
而且delete
是不幸的是完全没有意义的;你的代码说的是“如果数字n等于列表中的元素,则返回整个列表。否则,删除元素并继续删除元素,直到出现这种情况,或者列表为空。”
在delete
引发异常也没有根据该定义必要的。
我不知道你不理解的setSize是什么意思。它应该是一个设置列表大小的操作。如果大小小于当前长度,请重复赋值文本,删除过多的元素,否则使用零延长列表的末尾。
这是解决分配的模板:
datatype list_op = insert of int*int | delete of int | setsize of int
fun insert_h (0, elem, x::xs) = ... (* insert elem instead of x *)
| insert_h (pos, elem, []) = ... (* list was too short *)
| insert_h (pos, elem, x::xs) = ... (* not there yet *)
fun setsize_h (0, xs) = ... (* wonder what list has size 0 *)
| setsize_h (n, []) = ... (* extend list n times more *)
| setsize_h (n, x::xs) = ... (* not there yet *)
fun delete_h (0, x::xs) = ... (* delete element at this position *)
| delete_h (n, []) = ... (* list was too short *)
| delete_h (n, x::xs) = ... (* not there yet *)
fun execute_ops [] xs = ... (* no more operations to execute *)
| execute_ops (list_op::list_ops) xs =
let val new_xs = (case list_op of
insert (pos, elem) => insert_h (pos, elem, xs)
| delete pos => delete_h (pos, xs)
| setsize size => setsize_h (size, xs))
in execute_ops list_ops new_xs
end
您可能希望测试这些功能,无论是单独或组合使用execute_ops
:
val test_insert_h_1 = insert_h (2, 7, [1,2,3,4]) = [1,2,7,4]
val test_insert_h_2 = insert_h (9, 5, [1,2,3,4]) = [1,2,3,4,5]
val test_setsize_h_1 = setsize_h (2, [5,6,7,8]) = [5,6]
val test_setsize_h_2 = setsize_h (5, [1,2,3]) = [1,2,3,0,0]
val test_delete_h_1 = delete_h (3, [4,5,6,7,8]) = [4,5,6,8]
val test_delete_h_2 = delete_h (9, [1,2,3]) = [1,2,3]
val test_execute_ops_1 =
execute_ops [insert (0, 5), insert (1, 6), insert (2, 7)] [2,3,5] = [5,6,7]
val test_execute_ops_2 =
execute_ops [setsize 5, insert (4, 9)] [] = [0,0,0,0,9]
val test_execute_ops_3 =
execute_ops [setsize 6, insert (1, 5), delete 3] [8,8,8,8,9] = [8,5,8,9,0]