2

Haskell で両端キュー ("deque") を記述する方法。データ構造には、関数 emptyDeque、front、back、removeFront、removeBack、addFront、addBack、および isEmpty が必要であり、-> と <- の間に両端キューを表示します。

これは同じですが、Queue の場合です。

module Queues (Queue, emptyQueue, front, remove, add, isEmpty)
   newtype Queue a = Queue [a]
   emptyQueue = Queue []
   front  (Queue (x:xs)) = x
   front (Queue []) = error("No front of empty queue")
   add (Queue xs) x = Queue (xs ++ [x])
   remove (Queue (x:xs)) = Queue xs
   remove (Queue []) = error("Nothing on queue to remove")
   isEmpty (Queue []) = True
   isEmpty (Queue (x:xs)) = False
   showElems [] = ""
   showElems (x:xs) = " " ++ (Prelude.show x) ++ (showElems xs)
   showQueue (Queue a) = "<" ++ (showElems a) ++ " >"
   instance (Show a) => Show (Queue a) where show = showQueue

私が思いついたのは正しいですか?

module Deques (Deque, emptyDeque, front, back, removeFront, removeBack , addFront, addBack, isEmpty)
newtype Deque a = Deque [a]
emptyQueue = Queue []
reverses (x:xs) = (reverses xs) ++ [x]
front (Deque (x:xs)) = x
front (Deque []) = error("No front of empty Deque")
back (Deque a) = front(reverse(a))
back (Deque []) = error("No back of empty Deque")
addBack (Deque xs) x = Deque (xs ++ [x])
addFront (Deque xs) x = Deque ([x] ++ xs)
removeFront (Deque (x:xs)) = Deque xs
removeFront (Deque []) = error("Nothing on Deque to remove")
removeBack (Deque a) = reverses(removeFront(reverses(a))
                 `
4

2 に答える 2

6

リストを使用して Deque を実装するのはあまり効率的ではありませんが、機能します。いくつかのメモ

タイプエラーはさておき、関数アプリケーションを他の言語のスタイルで書いているようです

front(reverse(a))

Haskell では、括弧は単にグループ化のためのものです。その行を書くためのよりHaskellyな方法は次のようになります

front (reverse a)

あるいは

front $ reverse a

別の注意: リストの先頭に何かを追加することは、Haskell では非常に一般的です。

[x] ++ xs -- The weird way
x : xs -- The canonical way

ただし、リストの最後に追加するのは見苦しいです。

xs ++ [x] -- No better way for normal lists. This is inefficient

かなり良いスタートを切ることができましたが、Haskell の独自のパラダイムとスタイルに慣れる必要があります。Learn You a Haskellの最初の数章は、これをうまくやっています。

于 2011-04-25T20:04:54.747 に答える
1

実際にここで正常に動作する私の Final Deque 実装

module Deques (Deque, emptyDeque, front, back, removeFront, removeBack, addFront, addBack, isEmpty) where

    newtype Deque a = Deque [a]

    backwards (Deque []) = Deque []

    backwards (Deque a) = Deque( reverse a )

    emptyDeque = Deque []

    front (Deque (x:xs)) = x
    front (Deque []) = error("No front of empty Deque")

    back (Deque a) = front( backwards (Deque a))
    back (Deque []) = error("No back of empty Deque")

    addBack (Deque xs) x = Deque (xs ++ [x])
    addFront (Deque xs) x = Deque (x : xs)

    removeFront (Deque (x:xs)) = Deque xs
    removeFront (Deque []) = error("Nothing on Deque to remove")

    removeBack (Deque a) = backwards( removeFront( backwards (Deque a) ))
    removeBack (Deque []) = error("Nothing on Deque to remove")

    isEmpty (Deque []) = True
    isEmpty (Deque (x:xs)) = False

    showElems [] = ""
    showElems (x:xs) = " " ++ (Prelude.show x) ++ (showElems xs)
    showDeque (Deque a) = "<" ++ (showElems a) ++ " >"

    instance (Show a) => Show (Deque a) where show = showDeque
于 2011-05-04T02:16:24.967 に答える