2016-03-20 29 views
2

Bu etkin kalıp kullanımı neden derlenmiyor?Bu aktif kalıp kullanımı neden derlenmiyor?

aşağıdaki bir hata alırsınız:

match cell1 cell2 with 
| CellsAreDifferent -> isValueNeighbor cell1.X cell2.X 
        && isValueNeighbor cell1.Y cell2.Y 
| CellsAreSame  -> false 

tür uyuşmazlığı. Bir Cell bekleniyor -> Seçenek < 'a' b> ancak Hücre verilen -> Hücre -> Seçenek tipi 'Choice < 'a' b>' türü eşleşmiyor 'Hücre -> Seçenek'

kod

burada:

let (|CellsAreSame|CellsAreDifferent|) cell1 cell2 = 
     match cell1.X <> cell2.X 
      || cell1.Y <> cell2.Y with 
     | true -> CellsAreDifferent 
     | false -> CellsAreSame 

let isNeighbor cell1 cell2 = 

    let isAbsNeighbor v1 v2 = 
     match abs (v1 - v2) with 
     | 0 | 1 -> true 
     | _  -> false 

    let isValueNeighbor v1 v2 = 
     match v1 >= 0 
      && v2 >= 0 with 
     | true -> isAbsNeighbor v1 v2 
     | _  -> isAbsNeighbor v2 v1 

    match cell1 cell2 with 
    | CellsAreDifferent -> isValueNeighbor cell1.X cell2.X 
         && isValueNeighbor cell1.Y cell2.Y 
    | CellsAreSame  -> false 

Bu documentation başvurmak çalışıyordu.

cevap

4

Burada cell1 cell2 eşleştirmeye çalışıyorsunuz.

Bu, bir değeri bir işlev olarak kullanmaya çalıştığından, bir değer olarak mantıklı değildir.

En iyi çözümün, bir tuple geçmek olduğunu düşünüyorum.

let (|CellsAreSame|CellsAreDifferent|) (cell1, cell2) = 

ve

match (cell1, cell2) with 
+0

gibi bir şey Yani F # sadece tek girişe uyan desen gerçekleştirebilir? –

+1

Her desen eşleşmesi tek bir değer alır. Etkin bir model, eşleştirilecek tek bir değeri alır, ancak daha sonra başka parametreler de alabilir (yalnızca kısmi aktif modeller için). – TheQuickBrownFox