2011-11-03 125 views
0

嘿大家我正在一块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]) 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 

有人可以帮我解决这个问题?

谢谢

+0

您是否收到错误?如果是这样,你可以将它添加到你的问题? –

+0

我更新了它。谢谢 – functionalCode

+2

当问一个问题时,您应该尝试详细解释问题是什么,并且包含编译器错误信息 - 我们不应该猜测为什么“这是您的问题”以及如何解决问题。此外,您可以提出有用的问题和答案,并接受令人满意地解释您自己的问题的问题。这有助于组织Stackoverflow。 – hugomg

回答

2

看起来你的insert函数有两个问题。

首先,你的insert函数的两个定义返回不同的东西。

Set [list] -- Return type here is Collection 

[list] ++ numberToInsert -- Return type here is some sort of list, or [a0] 

因此,首先,你需要做的第二个版本返回Collection

Set ([list] ++ numberToInsert) 

但这仍然是错误的,因为numberToInsert是不是列表,并且++将两个列表连接在一起,所以我认为你真的想把它推到你的[list]的前面。 :用来推动一些a到的as列表的前面,像这样:

Set (numberToInsert:[list]) 

成品:

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

更新

正如你提到的,还有另外一问题我错过了。 list不应该包裹在方括号中,这就是为什么(如果你没有弄明白的话)。

当您在模式匹配(=的左侧)中使用方括号时,您的意思是:“给我一个看起来像这样的列表,并将它绑定到某个名称以备后用” 。所以你只希望有一个物品的清单,并决定拨打该项目list

接下来,当您将它作为[list]使用时,您在新列表中重新包装了一个项目。

这个例子:

foo [a] = a 
main = print $ foo [1] 

将打印 '1'。路过的两个项目的列表,但是,将无法模式匹配,因为你没有foo [a, b] = ...功能定义,因此警告:

main = print $ foo [1, 2] 

所以,是的,删除所有方括号的工作,因为你没有要求列表只有一个项目,而是说“整个列表将被称为list”,这可能是你想要的第一个地方。

+0

当我将括号括在列表中时,但当我删除它的括号时,我得到了错误非穷举式样匹配。 – functionalCode

+0

没关系我看到错误 – functionalCode

+0

哎呀,对不起。如果你还没有弄清楚为什么,请参阅我的更新。我希望有所帮助。 –

1

在这里雅去。

import Data.List (elem) 

data Collection = Set [Int] deriving (Show) 

insert :: Int -> Collection -> Collection 
insert numberToInsert [email protected](Set list) 
    | numberToInsert `elem` list = c 
    | otherwise = Set (numberToInsert:list) 
+0

感谢您的帮助,这对我帮助很大。 – functionalCode