0

私はこの割り当てを行っており、これを機能させるために必死です。これが最も賢い方法ではなく、最も効率的な方法でもないことを私は知っています。このコードがどれほど非効率的であるかをテストしたいので、これを純粋に行いました。

transition_from_conductor :: Element_w_Coord Cell -> List_2D Cell -> Cell
transition_from_conductor element world = case num_of_heads_around_conductor (0, element) world of
    1 -> Head
    2 -> Head
    _ -> Conductor
    where
        num_of_heads_around_conductor :: (Int, Element_w_Coord Cell) -> List_2D Cell -> Int
        num_of_heads_around_conductor (i, (cell, (x, y))) ((w_cell, (w_x, w_y): rest)) = case rest of
            [] -> i
            _  -> case (w_cell, w_x, w_y) of
                (Head, (x + 1),  y)        -> num_of_heads_around_conductor ((i + 1), (cell, (x, y))) (rest)
                (Head, (x + 1), (y + 1))   -> num_of_heads_around_conductor ((i + 1), (cell, (x, y))) (rest)
                (Head, (x + 1), (y - 1))   -> num_of_heads_around_conductor ((i + 1), (cell, (x, y))) (rest)
                (Head, (x - 1),  y)        -> num_of_heads_around_conductor ((i + 1), (cell, (x, y))) (rest)
                (Head, (x - 1), (y + 1))   -> num_of_heads_around_conductor ((i + 1), (cell, (x, y))) (rest)
                (Head, (x - 1), (y - 1))   -> num_of_heads_around_conductor ((i + 1), (cell, (x, y))) (rest)
                (Head,  x,      (y + 1))   -> num_of_heads_around_conductor ((i + 1), (cell, (x, y))) (rest)
                (Head,  x,      (y - 1))   -> num_of_heads_around_conductor ((i + 1), (cell, (x, y))) (rest)
                _                          -> num_of_heads_around_conductor ( i     , (cell, (x, y))) (rest)

これをターミナルで実行しようとすると、解析エラー(x + 1)が発生します。

(Head, (x + 1), y) .....

私は何を間違えましたか?どうすれば修正できますか?

いくつかのこと...

type List_2D e = [Element_w_Coord e]
type Element_w_Coord e = (e, Coord)
type Coord = (X_Coord, Y_Coord)
type X_Coord = Integer
type Y_Coord = Integer

ありがとうみんな:D

4

2 に答える 2

3

使用したのは「n+k」パターンで、言語から削除されています。'+'を使用して整数のパターンマッチングを行うことはできなくなりました。ほとんどの場合、パターンの一致はコンストラクターとリテラルに制限されています。

パターンマッチと同じ結果を得るには、次のことをお勧めします。

(Head, x0,  y)        -> let x = x0 - 1 in ...

このコードにはさらに問題があることに注意してください。パターンの一致が重複しています。例:n + kをサポートしている場合でも、次のパターンが発生することはありません。

(Head, (x + 1),  y)

失敗し、次のパターン:

(Head, (x + 1), (y + 1))

成功します。つまり、実行できないケースがたくさんあります。

于 2013-03-20T13:04:55.997 に答える
3

ここで間違っている2つのこと:

  • パターンで算術式を使用することはできません
  • パターンマッチングを試み、パターンのこれらの部分を既存の変数xy等しくなるように制約するつもりであるが、代わりに新しい変数を作成し、xyxy

私は警備員を使います。

_  -> case (w_cell, w_x, w_y) of
    (Head, x', y')
        | x' == x + 1 && y' == y     -> num_of_heads_around_conductor ((i + 1), (cell, (x, y))) (rest)
        | x' == x + 1 && y' == y + 1 -> num_of_heads_around_conductor ((i + 1), (cell, (x, y))) (rest)
        | x' == x + 1 && y' == y - 1 -> num_of_heads_around_conductor ((i + 1), (cell, (x, y))) (rest)
        | x' == x - 1 && y' == y     -> num_of_heads_around_conductor ((i + 1), (cell, (x, y))) (rest)
        | x' == x - 1 && y' == y + 1 -> num_of_heads_around_conductor ((i + 1), (cell, (x, y))) (rest)
        | x' == x - 1 && y' == y - 1 -> num_of_heads_around_conductor ((i + 1), (cell, (x, y))) (rest)
        | x' == x     && y' == y + 1 -> num_of_heads_around_conductor ((i + 1), (cell, (x, y))) (rest)
        | x' == x     && y' == y - 1 -> num_of_heads_around_conductor ((i + 1), (cell, (x, y))) (rest)
    _                                -> num_of_heads_around_conductor ( i     , (cell, (x, y))) (rest)

そして、単純化します。

_  -> case (w_cell, w_x, w_y) of
    (Head, x', y')
        |    x' == x + 1 && (y' == y || y' == y + 1 || y' == y - 1)
          || x' == x - 1 && (y' == y || y' == y + 1 || y' == y - 1)
          || x' == x     &&            (y' == y + 1 || y' == y - 1)
        -> num_of_heads_around_conductor ((i + 1), (cell, (x, y))) (rest)
    _   -> num_of_heads_around_conductor ( i     , (cell, (x, y))) (rest)

間違いなく、これはさらに単純化できます。

于 2013-03-20T15:19:47.450 に答える