2017-09-15 24 views
8

Bu kod OCaml yanı sıra F # gayet derler:Bu F #/OCaml "eşleşmesi" ifadesi neden derleniyor?

let testmatch k = 
    match k with 
    | jqk3jtl23jtlk123 -> true 

Ben FSI ve Utop hem de test ettik. Her zaman true döndürür.

jqk3jtl23jtlk123 tamamen rastgeledir ve türü 'a olarak çıkarılmıştır. Bir veri türü ile k sınırlamak bile (örneğin let testmatch (k: int) =) o (derler açıkçası int -> bool yerine 'a -> bool için testmatch 'ın türü zorlayıcı olsa

birisi neler olduğunu açıklayabilir misiniz Özellikle:.?

  • niçin derleyici kabul tamamen rastgele literal jqk3jtl23jtlk123?
  • ben neden bir inexhaustive maç uyarı alırım?
  • aslında?
  • yaptığını maçı ne
+7

Sen k' ne olursa olsun 'maçları' jqk3jtl23jtlk123' adında bir değeri oluştururken, değer 'jqk3jtl23jtlk123' karşı eşleşen değiliz eşdeğerdir. – Marth

+2

Bu dillerde genellikle ya bir değer ifadesinde ya da desen eşleme ifadesinde olursunuz ve bu ikisi farklı davranır. Desen eşleştirmesi, 'ile eşleştirildikten sonra, 'işlevinden sonra ve herhangi bir işlev/yöntem parametresinde olur. – TheQuickBrownFox

cevap

15

Bu durumda, "literal" jqk3jtl23jtlk123 geçerli bir değişken addır ve ->'un solundaki örüntü, let jqk3jtl23jtlk123 = k yazdığınızla aynıdır. Bu, k'un herhangi bir değerini kabul ettiğinden ve türünü kısıtlamadığından, her tür için ciltleme çalıştığı için, türünün temsil edebileceği en genel değer olan 'a türetilmiştir.

Sözdizimini geçerli bir tanıtıcı olmayan bir öğeye dönüştürürseniz, örneğin bir basamakla başlayarak, derleme yapamaz.

Alıntıyı tırnak içine kaydettiğinizde, bu bir dize değeri değişmezi olarak yorumlanacak, bitmeyen eşleşme uyarısını almalı ve k 'türünü string olarak sınırlayacaktır.

9

Bu, k'un her ne olduğuna eşit olan bir joker karakterdir. Bu

let testmatch k = 
    let jqk3jtl23jtlk123 = k in 
    true