1

Haskell 関数内でスタックを使いたいのですが、使い方がわかりません。私の機能は次のように動作するはずです:

  1. 文字列を取る
  2. この入力文字列の一部の要素を出力文字列に配置し、他の要素をスタックに配置します。
  3. その出力文字列にも要素をポップします。
  4. スタックが空になるまで 2 と 3 を再帰的に実行します。
  5. スタックが空のときに出力文字列を出力します。

そのスタックをいつどこで作成するかわかりません。私はHaskellプログラミングが初めてなので、自分でそれを理解できませんでした。コードを作成していないため、コードを表示することもできません。関数がアルゴリズム的にどのように見えるか教えていただけますか? スタックと出力文字列はどこで定義すればよいですか? ありがとう。

4

1 に答える 1

1

ここで快適なことの 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

少なすぎず多すぎないことを願っています。問題が発生したら、試してみて、より具体的な質問をしてください。

于 2013-03-10T20:22:28.823 に答える