2016-03-20 13 views
2

Warum kompiliert diese aktive Musterverwendung nicht?Warum kompiliert diese aktive Musterverwendung nicht?

Ich erhalte einen Fehler auf der folgenden:

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

Typenkonflikt. Erwartet eine Zelle -> Wahl < 'a,' b> aber gegeben Zelle -> Zelle -> Wahl Der Typ 'Wahl <' a, 'b>' stimmt nicht mit dem Typ 'Zelle -> Wahl'

überein

Der Code ist hier:

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 

ich diesen documentation zu verweisen versuchte.

Antwort

4

Hier versuchen Sie, auf cell1 cell2 übereinzustimmen.

Dies ist als Wert nicht sinnvoll, da es versucht, einen Wert als Funktion zu verwenden.

Ich denke, die beste Lösung wäre, zu einem Tupel zu wechseln.

So etwas wie

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

und

match (cell1, cell2) with 
+0

So kann Fis nur Muster auf einem einzelnen Eingangsanpassungsdurchführen? –

+1

Jede Musterübereinstimmung nimmt einen einzelnen Wert an. Ein aktives Muster nimmt den einzelnen Wert auf, auf den abgestimmt werden soll, aber es kann dann auch weitere Parameter annehmen (nur für partielle aktive Muster, denke ich). – TheQuickBrownFox

Verwandte Themen