2014-11-23 133 views
0

我在实施以下功能的困难:非详尽模式在函数声明

type Tabuleiro = [String] 
type Comandos = String 
type Comando = String 
type Coordenadas = String 

novaCoord :: Tabuleiro -> Comandos -> Coordenadas -> Coordenadas 

novaCoord l (cmd:xs) coor 
        | (c3 =="N") && cmd =='A' = [intToDigit(c1) , ' ',intToDigit(c2+1) , ' ',c3!!0] 
        | (c3 =="E") && cmd =='A' = [intToDigit(c1+1) , ' ',intToDigit(c2) , ' ',c3!!0] 
        | (c3 =="O") && cmd =='A' = [intToDigit(c1-1) , ' ',intToDigit(c2) , ' ',c3!!0] 
        | (c3 =="S") && cmd =='A' = [intToDigit(c1) , ' ',intToDigit(c2-1) , ' ',c3!!0] 
        | (c3 =="N") && cmd =='E' = [intToDigit(c1) , ' ',intToDigit(c2) , ' ',"O"!!0] 
        | (c3 =="E") && cmd =='E' = [intToDigit(c1) , ' ',intToDigit(c2) , ' ',"N"!!0] 
        | (c3 =="S") && cmd =='E' = [intToDigit(c1) , ' ',intToDigit(c2) , ' ',"E"!!0] 
        | (c3 =="O") && cmd =='E' = [intToDigit(c1) , ' ',intToDigit(c2) , ' ',"S"!!0] 
        | (c3 =="N") && cmd =='D' = [intToDigit(c1) , ' ',intToDigit(c2) , ' ',"E"!!0] 
        | (c3 =="E") && cmd =='D' = [intToDigit(c1) , ' ',intToDigit(c2) , ' ',"S"!!0] 
        | (c3 =="S") && cmd =='D' = [intToDigit(c1) , ' ',intToDigit(c2) , ' ',"O"!!0] 
        | (c3 =="O") && cmd =='D' = [intToDigit(c1) , ' ',intToDigit(c2) , ' ',"N"!!0] 
        | (c3 =="N") && cmd =='S' = [intToDigit(c1) , ' ',intToDigit(c2+1) , ' ',c3!!0] 
        | (c3 =="E") && cmd =='S' = [intToDigit(c1+1) , ' ',intToDigit(c2) , ' ',c3!!0] 
        | (c3 =="O") && cmd =='S' = [intToDigit(c1-1) , ' ',intToDigit(c2) , ' ',c3!!0] 
        | (c3 =="S") && cmd =='S' = [intToDigit(c1) , ' ',intToDigit(c2-1) , ' ',c3!!0] 


        where 
        ytotal=(length l)-1 
        coords=converte coor 
        (c1,c2,c3)=coords 
        y=l!!((ytotal)-(c2)) 
        x=y!!(c1) 

        converte :: Coordenadas -> (Int,Int,String) 
        converte [] = (0,0,"S") 
        converte (x:y:z) = 
            let 
            coords= words (x:y:z) 
            c = coords !! 2 
            a=read (coords !! 0) :: Int -- Coord X 
            b=read (coords !! 1) :: Int -- Coord Y 
            in (a,b,c) 

编译器抱怨我没有一个详尽的模式。我已经尝试过

novaCoord [] _ _ = ("0 0 S") 
novaCoord _ [] _ = ("0 0 S") 
novaCoord _ _ [] = ("0 0 S") 

但没有运气!我感谢任何可以提供的帮助,通用或不是!

+1

你也需要一个其他条款,并且converte不处理只有一个元素的列表。 – bheklilr 2014-11-23 00:31:46

+0

@bheklilr在我需要它的地方做了诡计!甚至没有注意到,你可以回答,所以我可以选择正确的。 – skills 2014-11-23 00:36:35

回答

3

你需要完成的模式匹配为novaCoord _ [] _,你需要一个otherwise子句中的后卫novaCoord,你在where子句中错过的情况下为converte [x]novaCoord