2015-10-04 3 views
5

Sono nuovo di F # e sto scrivendo un semplice algoritmo per abituarmi alla lingua, che richiede argMax. La libreria standard ha una funzione per cercare un elemento di lista che massimizzi una funzione? Cioè, se c'è una funzione esistente che si comporta come questo:La libreria F # ha una funzione standard per `argMax`?

let argMax f xs = 
    let rec go a fa zs = 
    match zs with 
     | [] -> a 
     | z :: zs' -> 
     let fz = f z 
     if fz > fa 
     then go z fz zs' 
     else go a fa zs' 
    match xs with 
    | []  -> invalidArg "xs" "empty" 
    | x :: xs' -> go x (f x) xs' 

risposta

9

Sì, ma si chiama List.maxBy.

Ecco un esempio:

let f x = -(x * x) + 100 * x + 1000 
List.maxBy f [0..1000] 
// val it : int = 50 

f 50 
// val it : int = 3500 

C'è anche List.minBy e le stesse funzioni sono disponibili per Seq e Array.