2012-12-07 12 views
17

Genellikle, F # desen değişkenlerinin aynı desende iki kez oluşmasına izin vermez. Ama aşağıdaki kodda, F # şikayet etmez - bu bir hata mı?Bir değişken neden desende iki kez birbirine bağlanabilir?

type foo = { A: int } 
let test (x, {A = x}) = x 
let result = test ("bla", {A = 3}) 
+2

Daha basit örnek - 'bırak testi (x, (x, y)) = 1 ' –

+3

Neden bu sorunun neden başarısız olduğunu bilmiyorum - bana ilginç bir problem gibi görünüyor! Bunun bir hata olduğunu düşünüyorum ve _microsoft_ dot _com_ adresinden _fsbugs_ adresine e-posta göndererek bildirebilirsiniz. –

+0

Bir hata olup olmadığından emin değilsiniz - en yakın tanımlanmış x'e bağlanarak kapsam belirleme kurallarını takip ediyor. – plinth

cevap

5

Bunun bir hata olduğunu sanmıyorum, kafa karıştırıcı gibi görünse de, ancak derleyicinin yukarıdaki değeri birleştirme işlemini yapmasıdır.

Bölüm (olgu burada olduğu gibi) değeri, tanım, tek bir değer model değilse, yetenekli bir sentezleme tmp taze tanımlayıcı ve her biri expri sonuçlar ila

tmp <typars1… typarsn> = expr 
ident1 <typars1> = expr1 
… 
identn <typarsn> = exprn 

olduğu 14.6.3 durumları desen patının (§7) giriş tmp'una karşı derlenmesi [spec'dan].

Let (test, 
    Lambda (tupledArg, 
      Let (x, TupleGet (tupledArg, 0), 
        Let (_arg1, TupleGet (tupledArg, 1), 
         Let (x, PropertyGet (Some (_arg1), A, []), x)))), 
    Application (test, NewTuple (Value (3), NewRecord (foo, Value (5))))) 

nedenini: Ben (bazı şeyleri bırakarak) olsun dize biçiminde

<@ let test (x:int, {A = x:int})= x in test (3, {A = 5}) @>;; 

:

biz bir F # tırnak, örneğin kullanabilirsiniz, derleyici ne yaptığını görmek için "iç" x olsun.

Bunun bir hata olduğunu sanmıyorum, ancak bunun bir uyarı üretmesi daha tutarlı olur.

+0

Bunun nedeni, F # değerinde gölge değerlerinin girilmesine izin vermesidir? – Goswin