1

私は、ポリモーフィック データ型 Bag の定義と、リストを Bag に変換し、2 つの Bag が同じかどうかをチェックするなどのいくつかの単純な関数を含む Haskell プログラムを作成する任務を負っています。

私の問題は、私が Haskell を初めて使用することです。そのため、バッグの使用方法がわかりません。バッグに関するリソースの方向性を教えてもらえますか?

4

1 に答える 1

6
  • 代数的データ型について読むことから始めることができます。
  • まず、ツリーのような単純な代数的データ型を実装してみてください。次に、独自のBagデータ型を実装できます。問題がある場合は、いつでもここで質問できます。
  • これが宿題でない場合は、すでに実装されているバッグを使用するかData.Map、同じものを実装するために使用できます。

Data.Map独自の代数的データ型を使用して記述していると思われる実装を比較するために、を使用して定義を与えました。

import qualified Data.Map as M
import Data.Map (Map)

newtype Bag a = Bag (Map a Int)
    deriving (Show,Eq)

empty :: Bag a
empty = Bag $ M.empty

singleton :: a -> Bag a
singleton a = Bag $ M.singleton a 1

fromList :: (Ord a) => [a] -> Bag a
fromList = foldl f empty
    where
        f (Bag map) x = Bag $ M.insertWith (+) x 1 map

toList :: Bag a -> [a]
toList (Bag m) = concatMap f $ M.toList m
    where f (a,b) = replicate b a

私はいくつかの非常に基本的な関数を定義しましたが、あなたはあなたが尋ねたものやもっとたくさんのことをすることができます

*Main> let x = fromList [1,2,3,2,2,1]
*Main> x
Bag (fromList [(1,2),(2,3),(3,1)])
*Main> let y = fromList [1,1,2,2,2,3]
*Main> y
Bag (fromList [(1,2),(2,3),(3,1)])
*Main> x==y
True
于 2012-10-19T03:15:58.057 に答える