4

四重項のリストと四重項 (x,y,z,f) を指定すると、タプル (x',y',z',g) を含むリストを返し、x = x' または y=y' または z = z' (これらは整数です)。これが私の最初の試みです

let rec constrained_by c list =
   match s with
   | []-> []
   | hd :: tl ->
 begin
   let Cell(x,y,r,_)=  c in  (*warning*)
   begin
     match hd with 
     | Cell(x,_,_,Some(_))-> hd::constrained_by c tl
     | Cell(_, y, _,Some(_)) -> hd::constrained_by c tl
     | Cell(_, _, r,Some(_)) -> hd::constrained_by c tl
     | _ -> constrained_by c tl
   end 
 end

問題: 呼び出されると、一致するクアッドに関係なく、元のリストが返されます。さらに、問題は、 行 ( warning )の x、y、rが使用されていないという警告を返すことです。

4

2 に答える 2

7

ジャイアンが言ったように、警備員はあなたの問題の解決策です. 良いニュースは、コードが記述された仕様に近づく可能性があることです。

let rec constrained_by ((x,y,z,_) as c) list = match list with
   | [] -> []
   | ((x',y',z',_) as c') :: tl when x = x' or y=y' or z=z' ->
       c' :: constrained_by c tl
    | hd :: tl -> constrained_by c tl
;;

小さなテスト:

let _ = constrained_by (1,2,3,"foo") [1,0,0,0; 0,2,0,0; 0,0,3,0; 0,0,0,0];;
- : (int * int * int * int) list = [(1, 0, 0, 0); (0, 2, 0, 0); (0, 0, 3, 0)]

も使用できることに注意してくださいList.filter

let constrained_by (x,y,z,_) = List.filter (fun (x',y',z',_) -> x = x' or y=y' or z=z');;
于 2013-03-21T10:29:00.117 に答える
4

そこでパターンマッチングを誤用していると思います。のようなパターンCell(x,_,_,Some(_))は rebinding であるため、何にでも一致しxます。スコープ内に変数があるという事実は、xそのタプル要素が と同じ値を持つことを主張するという意味ではありませんx。あなたの 3 つのパターンは、結果として一致するものは完全に同等です。

これがタスクを達成する方法である場合は、代わりにガードの使用を検討する必要があるかもしれません。

于 2013-03-21T09:46:15.683 に答える