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

我在下面的代码中得到了sml下标越界错误。我无法确定错误在哪里。有人能帮忙吗

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
,只是它可以概括为两对以上的列表