2016-03-20 9 views
2

なぜこのアクティブパターンの使用法はコンパイルされませんか?このアクティブパターンの使用法がコンパイルされないのはなぜですか?

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

型の不一致:

は、私は次のようにエラーが表示されます。 B ''>選択<>が、 セルを与えられた - - セルを期待して>セル - > Choiceの種類チョイス< '' B> '型 'セルを - >選択' と一致しません

コードはここにある:

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 

私はこのdocumentationを参照しようとしました。

答えて

4

ここではcell1 cell2にマッチしようとしています。

これは値を関数として使用しようとしているため、値としては意味がありません。

私は最高の解決策はタプルに変更することだと思います。

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

match (cell1, cell2) with 
+0

のようなものだからF#が単一の入力だけでパターンマッチングを行うことができますか? –

+1

各パターンマッチは単一の値をとります。アクティブなパターンは、一致する単一の値をとりますが、さらにパラメータを取ることもできます(部分的なアクティブなパターンの場合のみです)。 – TheQuickBrownFox

関連する問題