2013-03-10 81 views
1

我想在Haskell函數中使用堆棧,但我不知道如何使用它。我的功能應該是這樣工作的:在Haskell函數中使用堆棧

  1. 一個字符串
  2. 將這個輸入字符串輸出字符串的一些元素,並把他人疊加。
  3. 將元素也彈出到該輸出字符串。
  4. 做2和3遞歸,直到棧是空的。
  5. 當堆棧爲空時打印輸出字符串。

我不知道何時何地創建該堆棧。由於我在Haskell編程方面很新,所以我無法自己弄清楚。由於我沒有創建任何代碼,我也無法顯示任何代碼。你能以算法的方式告訴我函數的外觀嗎?我應該在哪裏定義堆棧和輸出字符串?謝謝。

回答

1

這裏的一個舒適的事情是,標準的Haskell列表是一個很好的堆棧(自然,記住堆棧是一個更受限制的列表)。你的功能可能看起來像這樣:

--takes one string and uses a stack to convert it to another string 
doSomethingWithStack :: String -> [String] -> String 
doSomethingWithStack str stack = 
    let str' = --here you embody your points 2 and 3 
     stack' = --stack top is (head stack), push is (x : stack), pop is (tail stack) 
     --... any change you'd want to make to any value turns into a new variable 
    in case stack'' of --check the final variables 
      [] -> str'' --if stack is empty, end 
      _ -> doSomethingWithStack str'' stack'' --if not, repeat 

--now, to make it pretty 
fancyWrapper :: String -> String 
fancyWrapper str = doSomethingWithStack str [] -- empty list is an empty stack 

--because you should strive to separate pure and impure functions 
--, I suggest that you do the print elsewhere, say 
main = do 
     str <- getLine 
     print $ fancyWrapper str 

希望這既不是太少,也不是太多。一旦遇到問題,請嘗試並詢問更具體的問題。

+0

感謝您的回答。該函數應該首先得到一個字符串。這是否符合你提供的結構? – jason 2013-03-10 20:57:48

+0

當你說「得到一個字符串」,你的意思是從命令行?如果是這樣,在'main'的'do'塊中添加'getLine'。 – 2013-03-10 21:55:17

+0

我的意思是功能將被稱爲像這樣使用擁抱: 函數「stackoverflow」 – jason 2013-03-10 22:02:52