2012-04-26 11 views
5

Voglio implementare una funzione F # che può accettare 1 o 2 argomenti. Vorrei utilizzare la funzione in questo modo:Come implementare argomenti variabili in F #

let foo = ... 
foo "a" 
foo "a" "b" 

Entrambi gli argomenti possono essere dello stesso tipo. Ho letto le pagine sul modello di partita , attivo, ma non riesco a trovarne uno funziona per me.

+0

È una cattiva abitudine rispondere, non ne hai veramente bisogno, ma è quello che mi viene in mente. Se i tuoi argomenti sono un elenco di valori dello stesso tipo, basta renderli un 'elenco'. Se uno di questi è facoltativo (ad esempio può avere un valore predefinito che può essere omesso), rendilo opzionale: 'pippo (a,? B)'. Puoi anche considerare DU, se i tuoi dati possono essere rappresentati in questo modo. Altrimenti, userei solo due funzioni. – bytebuster

risposta

2

In aggiunta alle altre risposte, potresti anche essere in grado di fare ciò che vuoi tramite applicazione parziale e currying. Come questo:

let foo a b = 
    a + b 

let foo2 a = 
    foo 1 a;; 

Ovviamente ci si vuole fissare il primo parametro nella chiamata a foo entro foo2 a tutto ciò che di default che si desidera.

7

Credo che questo sia dovuto ad alcune delle funzionalità di .NET sottostanti, ma io penso che si debba usare una classe con metodi di overload - qualcosa come

type t() = 
    static member foo a = "one arg" 
    static member foo (a,b) = "two args" 
+5

Si noti che il secondo deve essere una tupla perché altrimenti "foo" a "" è ambiguo tra la chiamata del primo sovraccarico e la seconda del curriculum. – Guvante

5

Su un membro di tipo, è possibile utilizzare params opzionali :

type Helper private() = 
    static member foo (input1, ?input2) = 
      let input2 = defaultArg input2 "b" 
      input1, input2 

Per chiamare questo metodo:

Helper.foo("a") 
Helper.foo("a", "b") 

E 'questo quello che stai cercando?

Purtroppo non è possibile utilizzare parametri opzionali su una funzione.

3

In aggiunta alle altre risposte, eccone alcune "quasi soluzioni". Non sono esattamente ciò che volevi, ma vale comunque la pena di saperlo.

Usando una lista (o un array) e pattern matching:

let f = function 
    | [a, b] -> ... 
    | [a] -> ... 
    | [] -> failwith "too few arguments" 
    | _ -> failwith "too many arguments" 

f ["a"] 
f ["a" ; "b"] 

problemi: parametri non sono chiamati, non è chiaro da firma funzione del numero di parametri che ci vuole.

Utilizzando un record per passare tutti i parametri opzionali:

type FParams = { a : string; b : string } 
let fdefault = { a = "a" ; b = "b" } 

let f (pars: FParams) = ... 

f { fdefault with b = "c" } 

Problema: una è anche facoltativa, che non è quello che si voleva. Può essere utile però.

Problemi correlati