F#在元组列表中查找不同的元素

Kha*_*775 1 f#

我有一个元组列表:

(string * (int * int)) list
let st = [("a1",(100,10)); ("a2",(50,20)); ("a3",(25,40))]
Run Code Online (Sandbox Code Playgroud)

我想在一些条件下创建一个返回bool的函数:两个int都必须大于0,列表中的字符串必须是不同的.

到目前为止,我有:

let rec inv st = List.forall (fun (a,(n,p)) -> n>0 && p>0) st
Run Code Online (Sandbox Code Playgroud)

但是我无法弄清楚如何找出列表中的所有字符串是否都是不同的.任何提示?

Gus*_*Gus 6

用途distinctBy:

let inv st =        
    List.length (List.distinctBy fst st) = List.length st && List.forall (fun (a,(n,p)) -> n>0 && p>0) st
Run Code Online (Sandbox Code Playgroud)

或者您可以在一个管道中组合两个检查:

let inv st =        
    st
    |> List.filter (fun (_,(n,p)) -> n>0 && p>0)
    |> List.distinctBy fst
    |> List.length
    |> (=) (List.length st)
Run Code Online (Sandbox Code Playgroud)