【问题标题】:Using Bag in Haskell在 Haskell 中使用 Bag
【发布时间】:2012-10-09 11:34:51
【问题描述】:

我的任务是创建一个 Haskell 程序,其中包含多态数据类型 Bag 的定义和一些简单的函数,例如将列表转换为 bag 并检查两个 bag 是否相同。

我的问题是我是 Haskell 的新手,所以我不确定如何使用 Bags。谁能指点我一些与 Bags 相关的资源的方向?

【问题讨论】:

  • 你真的没有任何人可以回答的具体问题。你知道什么是包吗?你知道如何用不同的语言实现它吗?从那里开始,尝试编写一个简单的 Haskell 版本;然后,如果您有具体问题,请修改您的问题。提出更具体的问题通常会使 SO 更有帮助。
  • 那里有包包库。谷歌搜索 Haskell Data.Bag 是查找相关材料的一种方法。
  • IIRC 包只是一个多件套。你不能使用 Data.Map 吗?

标签: list haskell functional-programming bag


【解决方案1】:
  • 您可以从阅读 algebraic 数据类型开始。
  • 首先尝试实现一个简单的代数数据类型,比如树,然后你可以去实现你自己的 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

【讨论】:

    猜你喜欢
    • 2014-06-22
    • 2017-09-11
    • 1970-01-01
    • 2011-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多