Functional programming 更新函数中的变量
我在SML中创建了一个函数,它遍历列表的起始元素,如果是第一个、第二个、第三个。。元素相同删除这些元素并更新变量的值。我写的是:Functional programming 更新函数中的变量,functional-programming,sml,smlnj,Functional Programming,Sml,Smlnj,我在SML中创建了一个函数,它遍历列表的起始元素,如果是第一个、第二个、第三个。。元素相同删除这些元素并更新变量的值。我写的是: let val min=7 in fun seen2 (set:int list) = if hd set=hd(tl set) then min=min-1 seen2(tl set) else tl set end 此函数的输出是一个删除了我提到的元素的列表。例如,如果它将此列表作为输入
let
val min=7
in
fun seen2 (set:int list) =
if hd set=hd(tl set) then
min=min-1
seen2(tl set)
else
tl set
end
此函数的输出是一个删除了我提到的元素的列表。例如,如果它将此列表作为输入->[1,1,1,1,2,3,4],并且在我给出[2,3,4]之前将min设置为7因此,min to更新为4。应该存储min变量,因为此函数可能会再次调用,min可能会进一步更新。此代码给我语法错误。最后必须打印最后的min,因此我认为这必须是一个全局值(?)。我如何才能做到这一点
遍历列表的起始元素,如果是第一个、第二个、第三个。。元素相同,删除这些元素
如果你所说的“第一、第二、第三…”是指任意多个,那么这就是你想要做的:
fun removeDuplicatesBeginning [] = []
| removeDuplicatesBeginning (x::y::zs) =
if (* are the first two elements the same? *)
then (* apply removeDuplicatesBeginning recursively
to sub-list with one of them removed *)
else (* no repeats, we're done recursing, only remove first element *)
使用测试来表达你想要的行为,例如
val test_1 = removeDuplicatesBeginning [1,1,1,1,2,3,4] = [2,3,4]
别忘了角落里的箱子
val test_2 = removeDuplicatesBeginning [2,3,4] = [3,4]
val test_3 = removeDuplicatesBeginning [1,2,1] = [2,1]
避免
let val min=7 in。。。结束
。没有意义让。。。有趣的是。。。end
,因为fun…
是一个声明,对于let
,只能在中的和end
之间使用表达式。(另一件事可以通过local…in…end
,但您仍然不想这样做。这没有意义。)
hd
和tl
。在输入列表的元素上使用模式匹配(x::xs
,或x::y::zs
)fun removeDuplicatesBeginning [] = []
| removeDuplicatesBeginning (x::y::zs) =
if (* are the first two elements the same? *)
then (* apply removeDuplicatesBeginning recursively
to sub-list with one of them removed *)
else (* no repeats, we're done recursing, only remove first element *)
使用测试来表达你想要的行为,例如
val test_1 = removeDuplicatesBeginning [1,1,1,1,2,3,4] = [2,3,4]
别忘了角落里的箱子
val test_2 = removeDuplicatesBeginning [2,3,4] = [3,4]
val test_3 = removeDuplicatesBeginning [1,2,1] = [2,1]
避免
let val min=7 in。。。结束
。没有意义让。。。有趣的是。。。end
,因为fun…
是一个声明,对于let
,只能在中的和end
之间使用表达式。(另一件事可以通过local…in…end
,但您仍然不想这样做。这没有意义。)
hd
和tl
。在输入列表的元素上使用模式匹配(x::xs
,或x::y::zs
)先生,谢谢您向我展示了使用模式匹配的正确方法。但是我想使用min,因为这是一个更大程序的一部分,但是对于本地程序,您建议我有错误。我能做什么?@Leopard:但是您没有说
min
应该包含什么。我假设它包含一些最小值,但事实上,您仅有的两个示例表明,它是示例中存储到min
的最大值。那么为什么不详细说明一下这个值的用途呢?它不是被移除的元素,也不是最小元素,也不是最后一个元素,也不是元素的数量。我这里真的没有什么想法了。:)先生,谢谢您向我展示了使用模式匹配的正确方法。但是我想使用min,因为这是一个更大程序的一部分,但是对于本地程序,您建议我有错误。我能做什么?@Leopard:但是您没有说min
应该包含什么。我假设它包含一些最小值,但事实上,您仅有的两个示例表明,它是示例中存储到min
的最大值。那么为什么不详细说明一下这个值的用途呢?它不是被移除的元素,也不是最小元素,也不是最后一个元素,也不是元素的数量。我这里真的没有什么想法了。:)