3 votes

Pourquoi F# échoue-t-il à prendre en charge l'extension du système de types avec son abréviation de type?

Par exemple, si j'essaie d'étendre int, avec int n'étant pas le véritable nom du type, ce code échouera :

type int with
member this.IsEven = this % 2 = 0

Je dois utiliser System.Int32 à la place :

type System.Int32 with
member this.IsEven = this % 2 = 0

//test
let i = 20
if i.IsEven then printfn "'%i' est pair" i

Pourquoi ne puis-je pas utiliser l'abréviation de type int ?

6voto

kvb Points 35490

Je pense que la réponse facile de Will est essentiellement correcte - les fonctionnalités ne sont pas implémentées par défaut. Cependant, une autre raison possible est que les abréviations de type sont cloisonnées, donc il n'est pas immédiatement évident si la portée de l'abréviation devrait influencer la portée de l'extension. Par exemple :

module X =
    type t = int

module Y =
    // imaginons que nous pourrions hypothétiquement faire cela
    type X.t with
        member i.IsEven = i % 2 = 0

open Y
fun (x:System.Int32) -> x.IsEven // cela devrait-il compiler même si t n'est pas en portée ici ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X