2017-10-16 2 views
2

Considérez ce qui suit:membres génériques avec la mise en œuvre fourni constructeur-

type Foo(bar:'a -> 'a list) = 
    member __.Bar = bar 

-je obtenir un avertissement sur la première 'a dans la liste des paramètres disant:

Cette construction provoque code moins générique que indiqué par les annotations de type. La variable de type 'a a été contrainte à être de type' obj '.

Pourquoi est-ce que j'obtiens cet avertissement?

Dans cet exemple spécifique, est-il possible d'avoir un membre qui convertit une valeur d'un type arbitraire en une liste de tels types et que ce membre soit fourni via le constructeur? (On pourrait par exemple imaginer Foo instancié avec List.replicate x pour tout entier x que l'utilisateur choisit.)

Je ne veux pas faire lui-même Foo générique, parce que j'ai beaucoup de ces paramètres et les membres.

(La raison pour laquelle j'essaie ce que je veux est une sorte de structure qui, entre autres, contient des fonctions génériques Overridable utilisateur.)

Répondre

3

Même si vous faites Foo générique, vous n'avez pas besoin de fournir explicitement les paramètres génériques lors de l'appel si elles peuvent être inférées:

type Foo<'a>(bar:'a -> 'a list) = 
    member __.Bar = bar 

Foo(fun x -> [x + 1]) 

Je ne sais pas si cela vous aide, mais en général "Functions lose genericity when passed as values".

+0

Merci, le lien a aidé. Je ne savais pas à ce sujet. – cmeeren