2011-07-08 44 views
3

我對Haskell類有這個任務,但是我覺得這很困難。如果你能幫上忙。 您將得到一個迷宮棘手的haskell問題

maze = ["x xxx", 
     "x x", 
     "x x x", 
     "x x ", 
     "xxxxx"] 

,你可以通過空格只能步行。你從(0,1)開始,該函數必須返回與方向的字符串逃過這是迷宮:

f - forward 
r- turn right 
l - turn left 

如果你有你總是喜歡選擇正確轉發,並轉發到左。 對於當前的例子,答案是事先

data Direction = N | W | S | E deriving (Show,Eq) 

maze = ["x xxx", 
     "x x", 
     "x x x", 
     "x x ", 
     "xxxxx"] 

d = 's' 
pos = (0,1) 

fpath d pos | fst pos == (length maze - 1) = "" 
      | snd (pos) ==0 || (snd (pos) == ((length (maze!!0))-1)) = "" 
      | rightPossible d pos = "r" ++ (fpath (rightRotate d) pos) 
      | forwardPossible d pos = "f" ++ (fpath d (nstep d pos)) 
      | True = "l" ++ fpath (leftRotate d) pos 
      where nstep :: Direction -> (Int, Int) -> (Int, Int) {-next step-} 
        nstep N (x,y) = (x-1,y) 
        nstep W (x,y) = (x,y-1) 
        nstep S (x,y) = (x+1,y) 
        nstep E (x,y) = (x,y+1) 

        rightPossible :: Direction -> (Int, Int) -> Bool 
        rightPossible N (x,y)= (maze !! x)!! (y+1) == ' ' 
        rightPossible W (x,y)= (maze !! (x-1))!! y == ' '    
        rightPossible S (x,y)= (maze !! x)!! (y-1) == ' '     
        rightPossible E (x,y)= (maze !! (x+1))!! y == ' ' 

        rightRotate :: Direction -> Direction 
        rightRotate N = E 
        rightRotate W = N 
        rightRotate S = W 
        rightRotate E = S 

        forwardPossible :: Direction -> (Int, Int) -> Bool 
        forwardPossible N (x,y)= ((maze !! (x-1))!! y) == ' ' 
        forwardPossible W (x,y)= ((maze !! x)!! (y-1)) == ' ' 
        forwardPossible S (x,y)= ((maze !! (x+1))!! y) == ' ' 
        forwardPossible E (x,y)= ((maze !! x)!! (y+1)) == ' ' 

        leftRotate :: Direction -> Direction 
        leftRotate N = W 
        leftRotate W = S 
        leftRotate S = E 
        leftRotate E = N 
+6

現在,哪裏是問題嗎?你已經做了什麼?你卡在哪裏? – Howard

+0

使用[「牆壁追隨者」](http://en.wikipedia.org/wiki/Maze_solving_algorithm);) – Jacob

+0

我在Haskell開始工作,我以前有過使用函數式語言的經驗。我知道我需要重新解決這個問題,但我無法在Haskel中實現它。 – munch

回答

7

我看到的第一件事是ffllffrffrfflf

謝謝,你有一個優先發布。表達式(maze !! x)!! y-1被解析爲((maze !! x)!! y)-1,而您希望它解析爲(maze !! x)!! (y-1)。添加大括號來解決這個問題。

添加後,您的代碼編譯,雖然你的算法似乎被打破。也許別人可以幫助你。

一些編碼建議:

  • 在適當的位置添加類型簽名以便調試。 (如果類型失敗,編譯器將更可能在正確的位置顯示錯誤)
  • 使用模式匹配而不是額外的case語句。取而代之的

    nstep d (x,y) {-next step-} 
           | d == 'n' = (x-1,y) 
           | d == 'w' = (x,y-1) 
           | d == 's' = (x+1,y) 
           | d == 'e' = (x,y+1) 
    

    nstep 'n' (x,y) = (x-1,y) 
    nstep 'w' (x,y) = (x,y-1) 
    nstep 's' (x,y) = (x+1,y) 
    nstep 'e' (x,y) = (x,y+1) 
    
  • 寫的,而不是依靠人物自己data類型。舉例來說,你可以爲方向創建自己的數據類型:

    data Direction = N | W | S | E deriving (Show,Eq) 
    
2

我FUZxxl同意。如果你犯了一個新的數據類型,你可以做的東西一樣

數據類型

data Direction = North | West | South | East deriving (Show,Eq) 
type Point = (Int, Int) 

以可讀的和有效的方式

nstep :: Direction -> Point -> Point 
nstep North (x,y) = (x-1,y) 
nstep West (x,y) = (x,y-1) 
nstep South (x,y) = (x+1,y) 
nstep East (x,y) = (x,y+1) 
使用的數據類型

又來了。此外,使用命名功能而不是僅僅r,這並不意味着太多。

rightPossible :: Direction -> Point -> Bool 
rightPossible North = (maze !! x)!! (y-1) == ' ' 
rightPossible West = (maze !! x+1)!! y == ' '    
rightPossible South = (maze !! x)!! (y+1) == ' '     
rightPossible East = (maze !! x-1)!! y == ' ' 

希望這有助於你理解的語言一點。

編輯:改變data Pointtype Point

+0

'data Point =(Int,Int)'不正確。 –

+0

謝謝! 這幫了我很多,但得到了無限的遞歸,儘管我已經三重檢查了代碼。 – munch

+0

您是否檢查過您沒有添加您已經訪問過的職位? – Landei