7

こんにちは私はこのように定義されたHaskellスタックのポップ関数とプッシュ関数を作成しようとしています:

data mystack = Empty | Elem Char mystack deriving Show

この定義制限がなかったら、このようにプッシュします

push x mystack = (x:mystack)

このようにポップします

pop mystack = head mystack

しかし、この制限があるため、これらの関数を実装する方法がわかりません。これらを行う方法のヒントを教えてください。その説明でStackタイプを自分で書くことさえできませんでした。

4

1 に答える 1

9

Hint: here is how you might implement your stack operations using the built-in list:

push :: a -> [a] -> ((),[a])  -- return a tuple containing a 'nothing' and a new stack
push elem stack = ((), (:) elem stack)

pop :: [a] -> (a, [a])  -- return a tuple containing the popped element and the new stack
pop [] = error "Can't pop from an empty stack!"
pop ((:) x stack) = (x, stack)

(:) x xs is an alternative way of writing x:xs.

To do this on your own MyStack type, note that your Empty actually works just like [], and Elem is equivalent to (:). I won't give you the code to do this outright, because figuring it out for yourself is half the fun!

于 2013-03-02T14:43:14.293 に答える