2017-10-18 12 views
-2

なぜこのエラーが発生するのか理解してくれる人がいますか? tar2.hs:41:40エラー:私はどこを移動しようとしましたが、私は同じエラーを取得し、入力「C」Haskell - >構文解析エラー 'どこで'

上のエラーを解析...

関数「avancarはA」受け取ります私が見る位置と向きと新しい位置を与え、その同じ向きに応じ

type Caminho = [Passo] 
data Passo 
    = Avanca 
    | Sobe 
    | Desce 
    | CurvaEsq 
    | CurvaDir 
    deriving (Eq,Read,Show) 

data Mapa = Mapa (Posicao,Orientacao) Tabuleiro 
    deriving (Eq,Read,Show) 

type Tabuleiro = [[Peca]] 

data Peca = Peca Tipo Altura 
    deriving (Eq,Read,Show) 

data Tipo = Rampa Orientacao | Curva Orientacao | Recta | Lava 
    deriving (Eq,Read,Show) 

type Posicao = (Int,Int) 
type Dimensao = (Int,Int) 
type Altura = Int 


    posi :: Tabuleiro -> Posicao -> Orientacao -> Peca 
    posi t (x,y) orientacao = (t !! y) !! x 

    tipo :: Peca -> Tipo 

tipo (Peca a h) = a 


new_pos :: Mapa -> Mapa 
new_pos (Mapa ((x,y), orientacao) []) = Mapa ((x,y),orientacao) [] 
new_pos (Mapa ((x,y), orientacao) (h:t)) | e == Recta = Mapa (b, orientacao) (h:t) 
             | e == Curva Norte && orientacao == Norte = Mapa (d, Este) (h:t) 
             | e == Curva Norte && orientacao == Oeste = Mapa (c, Sul) (h:t) 
             | e == Curva Sul && orientacao == Sul = Mapa (d, Oeste) (h:t) 
             | e == Curva Sul && orientacao == Este = Mapa (c, Norte) (h:t) 
             | e == Curva Este && orientacao == Este = Mapa (d, Sul) (h:t) 
             | e == Curva Este && orientacao == Norte = Mapa (c, Oeste) (h:t) 
             | e == Curva Oeste && orientacao == Oeste = Mapa (d, Norte) (h:t) 
             | e == Curva Oeste && orientacao == Sul = Mapa (c, Este) (h:t) 
             | e == Rampa Norte && orientacao == Norte = Mapa (b, orientacao) (h:t) 
             | e == Rampa Sul && orientacao == Norte = Mapa (b, orientacao) (h:t) 
             | e == Rampa Este && orientacao == Este = Mapa (b, orientacao) (h:t) 
             | e == Rampa Oeste && orientacao == Este = Mapa (b, orientacao) (h:t) 
             | e == Rampa Sul && orientacao == Sul = Mapa (b, orientacao) (h:t) 
             | e == Rampa Norte && orientacao == Sul = Mapa (b, orientacao) (h:t) 
             | e == Rampa Oeste && orientacao == Oeste = Mapa (b, orientacao) (h:t) 
             | e == Rampa Este && orientacao == Oeste = Mapa (b, orientacao) (h:t) 
             where 
             b = avancar (x,y) orientacao 
             c = avancar (x,y) (muda_esq orientacao) 
             d = avancar (x,y) (muda_dir orientacao) 
             e = tipo (posi (h:t) (x,y) orientacao) 

avancar :: Posicao -> Orientacao -> Posicao 
avancar (x,y) orientacao = if (orientacao == Norte) then (x,y - 1) 
    else if (orientacao == Sul) then (x,y + 1) 
     else if (orientacao == Este) then (x + 1,y) 
      else (x - 1,y) 
+0

'where'行は、上の' | 'ブロックまでインデントされていなければなりません。私は最初の '|'の前に改行を開始して、その巨大な空白ブロックを避けることをお勧めします。 – cdk

+2

@cdkこれは問題の原因ではありません。ガードはレイアウトに参加しません。 (私はこれをファイル自身でテストしました。つまり、 'where'ブロックは関数定義以上にインデントされていますが、ガードよりも少ないのは完全です。) –

+3

ソースコード自体をコピー&ペーストしてください。イメージでは、自分自身でエラーを再現し、修正案をテストすることはできません。また、ghci自身にロードできる十分なコードを含め、あなたが投稿したコードがあなたが主張しているエラーを与えることを自分自身でテストしてください。 SOにはMVCEの開発に関するヒントもあります(https://stackoverflow.com/help/mcve)。 –

答えて

3

のみパースエラーはpositipoのための型宣言は、何よりもインデントされていることです。私はそれを修正した後、このファイルはちょうど良い(たとえ他のエラーがありますが)解析します。

関連する問題