Desidero creare una libreria che crei oggetti utilizzando una funzione definita dall'utente e li modifichi utilizzando un'altra funzione definita dall'utente.OO alternativa al polimorfismo in F # quando si chiama F # da C#
Ho uno sfondo OCaml e vedo un modo abbastanza semplice per la sua attuazione:
//user side
type userType = { mutable time : float }
let userInitialization() = { time = 0. }
let userModification t = t.time <- t.time+1.
//my side
let algo initialization modification n =
let a = Array.init n (fun _ -> initialization())
modification a.[0]
a
Il problema è che voglio quella libreria per essere facile da chiamare da C#: con funzioni come argomenti è probabilmente una cattiva idea.
interfaccia e la classe astratta (che sarebbe ereditata da userType
) sembra essere la soluzione al solito OO, ma non posso inizializzare un oggetto se non so l'UserType (non ancora definito) rendendo la fase di inizializzazione, dentro la mia funzione, impossibile.
L'unica soluzione che posso pensare è di chiedere all'utente un'istanza del suo userType
come argomento che verrebbe utilizzato per chiamare l'inizializzazione, ma che sembra molto poco elegante.
C'è un modo per risolvere questo problema?
rendere l'interfaccia generica? –
Se ci si aspetta un uso intenso di C#, probabilmente si sta meglio con un'interfaccia, ma c'è anche 'Microsoft.FSharp.Core.FuncConvert' per la conversione tra C#' Funcs' o 'Actions' e F #' FSharpFuncs'. Potresti usarlo sul lato C# insieme al tuo codice corrente. – scrwtp