2017-04-07 5 views
3

Par exemple, si je tente d'étendre int, avec int n'est pas le vrai nom du type, ce code échouera:Pourquoi F # ne parvient-il pas à prendre en charge l'extension du type de système avec son abréviation de type?

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' is even" i 

Pourquoi peut Est-ce que j'utilise l'abréviation de type int?

+7

Parce que vous ne pouvez pas. Parce qu'ils ne l'ont pas écrit comme ça. Car. – Will

Répondre

6

Je pense que la réponse glib de Will est fondamentalement 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 étendues, 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 = 
    // imagine we could hypothetically do this 
    type X.t with 
     member i.IsEven = i % 2 = 0 

open Y 
fun (x:System.Int32) -> x.IsEven // should this compile even though t isn't in scope here?