2013-10-21 27 views
5

Bazı F # kodu ile this çevrimiçi derleyiciyi kullanarak oynuyordum (Tam olarak F # derleyici sürümünü bulamadım, bu daha sonra alakalı olacak). Neden '! =' Kullanımı belirsiz olarak değerlendiriliyor ama '=' kullanımı benzer değil?

let f x y = x = y 
let g x y = x != y 

f

tamamen genel ama benim için sürpriz g değildi: Aşağıdaki iki işlev çok farklıydı fark etti. g 1 2 çağrılması mesajı içeren bir derleme hatasına neden olur:

genel bir yapı tipi 'int' referans anlambilim var, ama ben gittim bir yapı

olup yani Götürmezse gerektirir

hata FS0332: Ben g tanımlamaya çalışırken bu benim kendi makinede çalıştı (mono F # 3.0 kullanarak, ama Visual Studio 2012 aynı sonucu almak) ve bambaşka bir hata aldı çözülemedi muğlaklık Bu program noktasında veya yakınında operatörün '(! =)' kullanımı. Belirsizliği gidermek için tür ek açıklamaları kullanmayı düşünün.

Neden bu kullanım != belirsiz ve neden bir hata? Ayrıca, neden !='un bu kullanımının neden belirsiz olduğu, ancak f'da = kullanımı neden değildir? Yeni hata, otomatik genellemenin beklediğim gibi çalışmadığı bir durumda beni uyarmada yardımcı oluyor. Ancak, bu F # derleyicisinin iki farklı sürümü arasında bir kırılma değişikliği gibi görünüyor. Bu hata iletilerinin her ikisi de aramaları boş döndü. İlgili görünen F# specification'da hiçbir şey görmedim. İlgili bölümlere işaretçiler yardımcı olabilir.

!= F # eşitsizlik operatörünün ismi olmadığını
+0

Link: http://stackoverflow.com/questions/9130181/what-is-the-f-syntax-for-not-equal-to – DuckMaestro

cevap

12

Not <> olduğunu. Buna rağmen en örnekte = olarak mümkün olmalıdır <> kullanma

http://msdn.microsoft.com/en-us/library/dd233228.aspx

.

+0

Şimdi neden '! =' Hatta izin verilir (belki de) özel bir operatör olabilir çünkü?). C# arka plan ile, '! =' Doğaldı ve bu online derleyici o kadar uzun süre kullanmama izin veriyor. –

+0

@mikez Bir derleyici, niyetini anlamak için çok fazla şey yapabilir. F # kodlayan herkes bir algol arka plandan gelmez. –

+0

@OnorioCatenacci Şaşkınlığımın bir kısmı, bu çevrimiçi derleyicide '! =' Ile beklediğim gibi çalışmış yazılı parçacıklara sahip olduğum gerçeğinden kaynaklanıyor. Derleyicilerini yükseltmek/düzeltmek için onlarla bir öneride bulundum. –

9

Varolan yanıt, kodun neden beklendiği gibi davranmadığını açıklıyor, bu yüzden hata mesajının ne söylemeye çalıştığına dair bir açıklama ekleyeyim. Bu durumda,

let fish x y = x <*>><< y 

:

F # özel operatörlerini destekler ve size bir işlev, örneğin balık operatörü kullanmayı deneyin başka (geçerli) operatörü sembolü için aynı hata iletisini alırsınız F # bir genel işlevi tanımlayamaz, çünkü .NET'in bir veya diğer bağımsız değişken türünün <*>><< operatörünü desteklediğini söyleyen genel kısıtlama belirtme yöntemi yoktur (.NET dilinde, kısıtlamanın türlerden biri olduğunu söylemesi gerekir. belirli bir statik yönteme ihtiyaç duyar).

Bu, karşılaştırma veya eşitlik için geçerli değildir (çünkü F # bunların bunları temsil etmenin bir yolu vardır). Ancak, + gibi bir şey kullanırsanız, yine de genel bir işlev almayacaksınız, ancak int'a özel bir işlev.Bu durumda, inline kullanmak ve jenerik bir fonksiyon yazabiliriz (+ operatör gerektirir):

let inline add x y = x + y 
add 1 2 
add 1.1 2.2 

Benzer şekilde, (balık veya != gibi) herhangi bir özel operatör gerektirir bir satır içi işlevi tanımlayın ancak olabilir hala herhangi bir standart tiple onu arayamazdı.

+2

+1 Harika detay, teşekkürler. Aynı durum ['¸. · ´¯ · .´¯ · .¸¸. · ´¯ · .¸><(((º>' operatörü] (http://1lineart.kulaone.com/art/41) için de geçerli midir? : P –

+0

Korkarım ki, özel işleçlerde izin verilen karakter kümesi [oldukça sınırlı] (http://msdn.microsoft.com/en-us/library/dd233204.aspx) ve özellikle herhangi bir ASCII olmayan karakterler. – Tarmil

+2

@RubenBartelink Yapabileceğin en iyisi muhtemelen .-^-..-^-..-^-..-^- .. >><<*> ':-) –