2011-11-03 165 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