List 检查列表内的列表是否有相等数量和空白

List 检查列表内的列表是否有相等数量和空白,list,f#,boolean,List,F#,Boolean,我试着在列表中列出一个列表。在这里,我检查每个列表中是否有相同数量的数字,并返回bool true/false。我不确定我是否做对了,它还需要检查每个列表是否为空,并返回true或false。我不能用头脑去想它。谢谢你! 我可以让这段代码更简单吗?我如何检查是否为空并返回bool true或false let lis1 = [[ 1; 2; 3; ] ; [ 4; 5; 6; ]] let isTable (lis1 : 'a list list) = let m

我试着在列表中列出一个列表。在这里,我检查每个列表中是否有相同数量的数字,并返回bool true/false。我不确定我是否做对了,它还需要检查每个列表是否为空,并返回true或false。我不能用头脑去想它。谢谢你! 我可以让这段代码更简单吗?我如何检查是否为空并返回bool true或false

  let lis1 = [[ 1; 2; 3; ] ; [ 4; 5; 6; ]]

    let isTable (lis1 : 'a list list) = 
        let mutable tabellen = false
        let item0 = lis1.Item 0
        for i = 0 to (lis1.Length)-1 do 
            if item0.Length = (lis1.Item i).Length then 
                tabellen <- true
            else
                tabellen <-false
        tabellen

    printfn"%b" (isTable lis1)
让lis1=[[1;2;3;];[4;5;6;]]
let isTable(lis1:“列表)=
设可变tabellen=false
设item0=lis1。项0
对于i=0到(lis1.Length)-1 do
如果item0.Length=(lis1.Item i.Length),则
tabellen在F#中,通常最好从函数和不可变的数据类型开始,除非您绝对需要改变某些内容

您可以映射列表以获得每个内部列表的长度,如下所示:

List.map List.length lis1
// yields: [3; 3]
然后,您可以通过
list从该列表中获取不同的项目。distinct

List.map List.length lis1 |> List.distinct
// yields: [3]
您可以根据列表的长度进行模式匹配,并且根据您的逻辑,您可以通过结果列表中是否有单个项来确定列表列表是否为表

let isTable list =
    match List.map List.length list |> List.distinct |> List.length with
    | 1 -> true
    | _ -> false
示例:

printfn "%A" <| isTable [[ 1; 2; 3; ] ; [ 4; 5; 6; ]]
// yields: true

printfn "%A" <| isTable [[ 1; 2; ] ; [ 3; 4; 5; 6; ]]
// yields: false

printfn "%A" <| isTable []
// yields: false

printfn“%A”您可以将@ChadGilbert的答案写成一行(如果您不介意它稍微长一点的话):

简而言之,您可以立即看到正在发生的事情,但效率不高,因为它会重复列表两次。为了防止您需要更高效的解决方案,我提出了以下建议:

let isTable = function
    | [] -> true
    | h :: t ->
        List.length t = 0 ||
        List.forall (fun l -> List.length h = List.length l) t
这将首先检查列表是否为空(我将该案例定义为一个表,但可以在那里随意返回
false
),如果不是,它将在尾部工作。如果它是空的,列表只有一个元素,因此它只是一个表;否则,请检查所有列表是否与第一个列表具有相同的长度

let isTable = function
    | [] -> true
    | h :: t ->
        List.length t = 0 ||
        List.forall (fun l -> List.length h = List.length l) t