我有一个元组列表:
(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)
但是我无法弄清楚如何找出列表中的所有字符串是否都是不同的.任何提示?
用途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)