Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 在Haskell中使用Bag_List_Haskell_Functional Programming_Bag - Fatal编程技术网

List 在Haskell中使用Bag

List 在Haskell中使用Bag,list,haskell,functional-programming,bag,List,Haskell,Functional Programming,Bag,我的任务是创建一个Haskell程序,其中包含多态数据类型包的定义和一些简单的函数,例如,将列表转换为包,并检查两个包是否相同 我的问题是我是哈斯克尔的新手,所以我不知道如何使用袋子。有人能告诉我一些关于行李的资源吗? 您可以从阅读数据类型开始 首先尝试实现一个简单的代数数据类型,比如tree,然后您可以实现自己的Bag数据类型。如果你有任何问题,你可以在这里问 如果这不是一个家庭作业,那么您可以使用已经实施的行李或使用Data.Map实施相同的任务 我使用Data.Map给出了定义,以比较您

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

我的问题是我是哈斯克尔的新手,所以我不知道如何使用袋子。有人能告诉我一些关于行李的资源吗?

  • 您可以从阅读数据类型开始
  • 首先尝试实现一个简单的代数数据类型,比如tree,然后您可以实现自己的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
  • 您可以从阅读数据类型开始
  • 首先尝试实现一个简单的代数数据类型,比如tree,然后您可以实现自己的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

你没有一个任何人都能回答的具体问题。你知道什么是包吗?您是否知道如何用不同的语言实现它?从这里开始,尝试编写一个简单的Haskell版本;然后,如果你有具体的问题,修改你的问题。问更具体的问题通常会更有帮助。那里有专门的书包库。谷歌搜索Haskell数据。袋子是找到相关材料的一种方法。IIRC袋子只是一个多集。你不能使用数据。地图吗?你没有一个任何人都能回答的具体问题。你知道什么是包吗?您是否知道如何用不同的语言实现它?从这里开始,尝试编写一个简单的Haskell版本;然后,如果你有具体的问题,修改你的问题。问更具体的问题通常会更有帮助。那里有专门的书包库。谷歌搜索Haskell数据。袋子是找到相关材料的一种方法。IIRC袋子只是一个多集。你不能使用数据。地图吗??