1

次のように書けるようにするには、haskell でスタック データ型を作成する必要があります。

let a = emptyStack

push 10 a
//[10]

pop a 
[]

プッシュを次のようにしたい

push :: a -> Stack a -> Stack a
push a b = a:b

しかし、構文、つまりこの新しいデータ型を正確に宣言する方法に問題があるため、

let a = emptyStack 
:t a

スタックを表示します

構文に関するヒント

4

2 に答える 2

4

あなたは書ける

import Data.Maybe

data Stack a = Stack [a] deriving Show

empty :: Stack a
empty = Stack []

push :: a -> Stack a -> Stack a
push x (Stack xs)= Stack (x:xs)

pop :: Stack a -> (Maybe a, Stack a)
pop (Stack []) = (Nothing, Stack [])
pop (Stack (x:xs)) = (Just x, Stack xs)

*Main> push 4 $ push 3 empty
Stack [4,3]
*Main> pop $ push 4 $ push 3 empty
(Just 4,Stack [3])

このアプローチは、型引数を厳密にチェックしています(@mhwombatソリューションとは対照的です)。いずれかのアプローチが有効です (場合によっては、あるアプローチが他のアプローチよりも優れている場合もあれば、その逆の場合もあります)。

于 2012-12-20T11:40:00.507 に答える
4

の実装を見てみましょうpush。演算子を使用します:。次のように、その演算子のタイプを確認できます。

ghci> :t (:)
(:) :: a -> [a] -> [a]

したがって、この演算子はa(任意の型を表す) とas のシーケンスを取り、更新されたシーケンスを返します。したがって、タイプStackはシーケンスである必要があります。

type Stack a = [a]

次に、次のように emptyStack を定義すると:

emptyStack :: Stack a
emptyStack = []

探している結果が得られます。

ghci> :t a
a :: Stack a

その助けを借りて、あなたは書き方を理解できると思いますpop

于 2012-12-20T11:19:15.593 に答える