2013-08-14 12 views
6

Mam klasę w mojej aplikacji - dla uproszczenia przyjmijmy, że jest zdefiniowany następująco:Użyj funkcji z argumentem typu pochodnej (F #)

type baseType() = 
    member this.A = 5. 

też mam dużo funkcji, które przyjmują obiekty tego typu jako argument. Co więcej, niektóre z nich podejmuje szereg tego typu:

let myFun (xArr : baseType[]) = 
    // ... do something inspirig ;) 

Teraz zdałem sobie sprawę, że byłoby miło mieć inną klasę, która wynika z „baseType”. np .:

type inhType() = 
    inherit baseType() 
    member this.B = 8. 

Jednak nie mogę korzystać z tablic typu odziedziczonego z funkcjami jak „myFun”

let baseArr = [| baseType() |] 
let inhArr = [| inhType() |] 

myFun baseArr 
myFun inhArr // won't work 

który będzie „miło mieć”. Czy istnieje prosty sposób na ponowne wykorzystanie moich funkcji bez stosowania tak wielu zmian?

Domyślam się, że jednym z rozwiązań jest mapowanie mojej tablicy za pomocą np. funkcja (fun (d: inhType) -> d:> baseType), ale zastanawiam się, czy można coś jeszcze zrobić.

Odpowiedz

9

Musisz opisać swoją funkcję jako akceptującą flexible type.

type A() = class end 
type B() = inherit A() 

let aArr = [| A() |] 
let bArr = [| B() |] 

// put # before type to indicate it's a flexible type 
let f (x : #A[]) =() 

f aArr 
f bArr // works! 
+0

Sprawdziło się dla mnie - dzięki :). –

3

można także wypełnić tablicę A z wystąpień podtyp B, za pomocą opisu typu:

let bArr: A[] = [| B() |] 

Może to być przydatne do jednorazowego użytku lub gdy funkcja w bibliotece strony trzeciej. Innym powszechnym zastosowaniem jest tworzenie pudełkowych macierzy (obj[]).

+2

To prawda, ale zauważ, że działa to tylko z literałami tablicowymi. Coś takiego jak 'let bArr: A [] = Array.create 1 (B())' nie zadziała. – kvb

Powiązane problemy