Haskell数据类型困境

Haskell数据类型困境,haskell,Haskell,大家好,我正在处理一段Haskell代码,无法解决此问题 我得到这个错误: Couldn't match expected type `Collection' with actual type `[a0]' In the expression: [list] ++ numberToInsert In an equation for `insert': insert numberToInsert (Set [list]) | contains (Set [list]) numb

大家好,我正在处理一段Haskell代码,无法解决此问题

我得到这个错误:

Couldn't match expected type `Collection' with actual type `[a0]'
In the expression: [list] ++ numberToInsert
In an equation for `insert':
    insert numberToInsert (Set [list])
      | contains (Set [list]) numberToInsert == True = (Set [list])
      | otherwise = [list] ++ numberToInsert
失败,已加载模块:无

这是我的密码

data Collection = Set [Int] deriving (Show)


insert :: Int -> Collection -> Collection
insert numberToInsert (Set [list])
    |contains (Set [list]) numberToInsert == True = (Set [list])
    |otherwise = [list] ++ numberToInsert  <--- this is my problem

contains :: Collection -> Int -> Bool
contains (Set []) numberToFind = False
contains (Set (x:xs)) numberToFind
    |x == numberToFind = True
    |otherwise = contains (Set (xs)) numberToFind
data Collection=Set[Int]派生(显示)
插入::Int->Collection->Collection
插入号码插入(设置[列表])
|包含(集合[列表])numberToInsert==True=(集合[列表])
|否则=[list]++numberToInsert Int->Bool
包含(集合[])numberToFind=False
包含(集合(x:xs))numberToFind
|x==numberToFind=True
|否则=包含(Set(xs))numberToFind
有人能帮我修一下吗

谢谢

给你

import Data.List (elem)

data Collection = Set [Int] deriving (Show)

insert :: Int -> Collection -> Collection
insert numberToInsert c@(Set list)
  | numberToInsert `elem` list = c
  | otherwise = Set (numberToInsert:list)
给你

import Data.List (elem)

data Collection = Set [Int] deriving (Show)

insert :: Int -> Collection -> Collection
insert numberToInsert c@(Set list)
  | numberToInsert `elem` list = c
  | otherwise = Set (numberToInsert:list)

您的
insert
功能似乎有两个问题

首先,您对
insert
函数的两个定义返回不同的结果

Set [list]   -- Return type here is Collection

因此,首先,您需要使第二个版本返回一个
集合

Set ([list] ++ numberToInsert)
但这仍然是错误的,因为
numberToInsert
不是一个列表,
++
将两个列表连接在一起,所以我认为您确实想将其推到
[list]
的前面
用于将一些
a
推到
列表的前面,例如:

Set (numberToInsert:[list])
成品:

insert :: Int -> Collection -> Collection
insert numberToInsert (Set [list])
    | contains (Set [list]) numberToInsert == True = (Set [list])
    | otherwise = Set (numberToInsert : [list])
更新

正如你提到的,还有一个问题我错过了<代码>列表
不应该用方括号括起来,原因如下(以防你没有弄明白)

当您在模式匹配中使用方括号(在
=
的左侧)时,您的意思是:“给我一个类似这样的列表,并将它唯一的项绑定到某个名称以供以后使用”。因此,您只希望列表包含一个项目,并决定将该项目称为
list

接下来,当您将该项用作
[list]
时,将其重新打包到新列表中

这个例子:

foo [a] = a
main = print $ foo [1]
将打印“1”。但是,传递两个项目的列表将无法进行模式匹配,因为没有定义
foo[a,b]=…
函数,因此出现警告:

main = print $ foo [1, 2]

因此,删除所有方括号是可行的,因为您不要求列表只有一项,而是说“整个列表将被称为
list
”,这可能是您首先想要的。

您的
insert
功能似乎有两个问题

首先,您对
insert
函数的两个定义返回不同的结果

Set [list]   -- Return type here is Collection

因此,首先,您需要使第二个版本返回一个
集合

Set ([list] ++ numberToInsert)
但这仍然是错误的,因为
numberToInsert
不是一个列表,
++
将两个列表连接在一起,所以我认为您确实想将其推到
[list]
的前面
用于将一些
a
推到
列表的前面,例如:

Set (numberToInsert:[list])
成品:

insert :: Int -> Collection -> Collection
insert numberToInsert (Set [list])
    | contains (Set [list]) numberToInsert == True = (Set [list])
    | otherwise = Set (numberToInsert : [list])
更新

正如你提到的,还有一个问题我错过了<代码>列表
不应该用方括号括起来,原因如下(以防你没有弄明白)

当您在模式匹配中使用方括号(在
=
的左侧)时,您的意思是:“给我一个类似这样的列表,并将它唯一的项绑定到某个名称以供以后使用”。因此,您只希望列表包含一个项目,并决定将该项目称为
list

接下来,当您将该项用作
[list]
时,将其重新打包到新列表中

这个例子:

foo [a] = a
main = print $ foo [1]
将打印“1”。但是,传递两个项目的列表将无法进行模式匹配,因为没有定义
foo[a,b]=…
函数,因此出现警告:

main = print $ foo [1, 2]

因此,是的,删除所有方括号是可行的,因为您不要求列表只有一项,而是说“整个列表将被称为
list
”,这可能是您首先想要的。

是否有错误?如果是这样的话,你能把它添加到你的问题中吗?当你问一个问题时,你应该试着详细解释问题是什么,这包括编译器错误消息-我们不应该猜测为什么“这是你的问题”以及如何解决它。此外,您还可以向上投票有用的问题和答案,并接受能够令人满意地解释您自己问题的问题。这有助于组织堆栈溢出。是否收到错误?如果是这样的话,你能把它添加到你的问题中吗?当你问一个问题时,你应该试着详细解释问题是什么,这包括编译器错误消息-我们不应该猜测为什么“这是你的问题”以及如何解决它。此外,您还可以向上投票有用的问题和答案,并接受能够令人满意地解释您自己问题的问题。这有助于组织Stackoverflow。感谢您的帮助,这对我帮助很大。感谢您的帮助,这对我帮助很大。当我将括号放在列表周围时,我得到了非穷举模式匹配错误,但当我删除括号时,它会起作用。哦,很抱歉。如果你还不知道原因,请查看我的更新。我希望这能有所帮助。当我在列表周围放括号时,我得到了非穷举模式匹配的错误,但当我删除括号时,它就起作用了。哦,很抱歉。如果你还不知道原因,请查看我的更新。我希望这有帮助。