2 Haskell的数据列表比较

2 Haskell的数据列表比较,haskell,haskell-stack,Haskell,Haskell Stack,我在haskell中有两个数据列表,每个列表包含一个id属性。我想比较两个列表,并返回第一个列表中的所有数据对象,而不是第二个列表中的所有数据对象 以下是一个例子: 您可以使用数据列表中的相交对象和\\ 使用intersectBy可以创建公共元素列表,然后使用\\删除列表中的公共元素 期望结果的数学术语是一个集合在另一个集合中的相对补充,所以我将这样调用主函数 注意:我为书中定义了Eq实例,其中equality表示id的相等,但这只是为了elem的利益。如果该定义不符合您的需要,则将删除中的el

我在haskell中有两个数据列表,每个列表包含一个id属性。我想比较两个列表,并返回第一个列表中的所有数据对象,而不是第二个列表中的所有数据对象

以下是一个例子:
您可以使用
数据列表中的
相交对象
\\

使用
intersectBy
可以创建公共元素列表,然后使用
\\
删除列表中的公共元素

期望结果的数学术语是一个集合在另一个集合中的相对补充,所以我将这样调用主函数

注意:我为书中定义了Eq实例,其中equality表示id的相等,但这只是为了elem的利益。如果该定义不符合您的需要,则将删除中的elem use替换为检查ID的内容。

导入数据。列表仅用于intersectBy函数

import Data.List

type IDLibrary = Int
type Location = String
type Author = String

data Book = Book IDLibrary Author deriving Show
data Library = LibraryBook IDLibrary Location deriving Show

instance Eq Book where
  (==) (Book id _) (Book id' _) = id == id'

listB :: [Book]
listB = [Book 1 "Anthony C", Book 3 "David Weber"]
listL :: [Library]
listL = [LibraryBook 1 "Alaska", LibraryBook 2 "Majorka"]

relativeComplement :: [Book] -> [Library] -> [Book]
relativeComplement xs ys = xs `remove` common xs ys

remove :: [Book] -> [Book] -> [Book]
remove xs ys = filter (not . (`elem` ys)) xs

common :: [Book] -> [Library] -> [Book]
common xs ys = intersectBy sameID xs (intoBooks ys)

sameID :: Book -> Book -> Bool
sameID (Book id1 _) (Book id2 _) = id1 == id2

intoBooks :: [Library] -> [Book]
intoBooks = map turnIntoBook
          where turnIntoBook (LibraryBook id _) = Book id ""
输出:

[第三册“大卫·韦伯”]


PS决不是说我的代码质量很高,我也在学习Haskell。

你能添加一些代码,使这些列表包含的内容更加明确吗?当然可以!type idLibrary=Int type location=String type author=String data Book=Book idLibrary author派生Show data Library=Book idLibrary location派生Show Book1=(Book 1“Anthony C”)Library 1=(Library 2“Alaska”)listB::[Book]listB=[Book1]listL:[Library]listL=[Library 1]这是无效的haskellcode@EraseMe您应该能够编辑问题(我认为某些类型的问题也需要大写字母才能有效),您可以提供一个示例吗?
import Data.List

type IDLibrary = Int
type Location = String
type Author = String

data Book = Book IDLibrary Author deriving Show
data Library = LibraryBook IDLibrary Location deriving Show

instance Eq Book where
  (==) (Book id _) (Book id' _) = id == id'

listB :: [Book]
listB = [Book 1 "Anthony C", Book 3 "David Weber"]
listL :: [Library]
listL = [LibraryBook 1 "Alaska", LibraryBook 2 "Majorka"]

relativeComplement :: [Book] -> [Library] -> [Book]
relativeComplement xs ys = xs `remove` common xs ys

remove :: [Book] -> [Book] -> [Book]
remove xs ys = filter (not . (`elem` ys)) xs

common :: [Book] -> [Library] -> [Book]
common xs ys = intersectBy sameID xs (intoBooks ys)

sameID :: Book -> Book -> Bool
sameID (Book id1 _) (Book id2 _) = id1 == id2

intoBooks :: [Library] -> [Book]
intoBooks = map turnIntoBook
          where turnIntoBook (LibraryBook id _) = Book id ""