Sml 越界下标
我在下面的代码中得到了sml下标越界错误。我无法确定错误在哪里。有人能帮忙吗Sml 越界下标,sml,Sml,我在下面的代码中得到了sml下标越界错误。我无法确定错误在哪里。有人能帮忙吗 fun extract_Bools nil = nil | extract_Bools ((_,x)::xs) = let val Boolists = x::extract_Bools(xs) val Len = length(Boolists) in List.tabulate(Le
fun extract_Bools nil = nil
| extract_Bools ((_,x)::xs) = let
val Boolists = x::extract_Bools(xs)
val Len = length(Boolists)
in
List.tabulate(Len,fn i => map (fn Boolists => (List.nth(Boolists,i))) Boolists)
end;
这个函数以[([1,2,3],[false,false]),([4],[true,false]),([2,3,4,5,6],[false,false]),([23,45,23],[true,true])
为例,应该返回一个bool列表
,在该列表中,相似位置的元素将放在一个列表中
例如,我们应该返回
[[false,true,false,true],[false,false,false,true]
错误在布尔列表的计算中。您递归调用extract\u Bools
,期望它为您提供列表中所有元组的第二个元素,但extractBools
所做的不仅仅是这些。您需要第二个函数来从原始列表中拉出布尔列表
此外,Len是错误的-它不是您想要的列表的长度,而是列表中列表的长度。在这里,我假设所有布尔列表的长度都是相同的,并且给定一个空列表,您希望返回一个空列表
local
fun getBools xs = map (fn (_,b) => b) xs
in
fun extractBools xs =
let
val blists = getBools xs
val len = case blists of
[] => 0
| (x::xs) => length x
in
List.tabulate(len, fn i => map (fn l => List.nth(l,i)) blists)
end
end
我已经重命名了一些变量-SML中的一个惯例是让变量名以小写字母开头,并用驼峰大小写而不是使用下划线。请为您的函数提供规范。名称阴影使其难以解开。我添加了更多信息,我可能还想添加,该函数的行为类似于ListPair.zip
,只是它可以概括为两对以上的列表