2017-05-30 40 views
0

我是Haskell的新手,正在做一些簡單的練習。對於這個練習,我正在寫一個函數來檢查一個列表是否是使用遞歸的另一個列表的子集。非常簡單的Haskell代碼不起作用,「變量不在範圍內」

下面的代碼:

subset [] xs = True 

subset (x:xs) ys = if elem x ys == False then False 
        else subset (tail xs) (delete x ys) 

我收到以下錯誤信息:

C:\Functioneel programmeren\week4.hs:9:43: error: 
    Variable not in scope: delete :: t1 -> t t1 -> t t1 

是什麼意思,甚至?

只有當我將「(刪除x ys)」改爲「ys」時,該程序才起作用,但是它不會做它應該做的事情。

任何幫助將是偉大的,在此先感謝。

+2

定義了「delete」的位置? – Polygnome

+0

我的印象是,這是Haskell的一個內置函數:http://hackage.haskell.org/package/base-4.9.1.0/docs/Data-List.html#v:delete – Meurth

+0

順便說一句,你的'if'可以用更易讀的形式重寫爲'elem x ys && subset ...'。通常,我們傾向於在Haskell中避免'== False'和'if..then False'。另外'tail xs'看起來不正確,你確定你不需要'xs'嗎? – chi

回答

3

delete需要導入。根據https://www.haskell.org/hoogle/?hoogle=delete,您應該添加import Data.List到開頭。

此外,我想你的功能subset是錯誤的。 subset [1, 2, 1] [1, 2, 3]的結果是False

+0

謝謝,我不知道我必須導入它。我認爲這樣的結果應該是錯誤的,因爲在你的例子 – Meurth

+0

的第二個列表中只有一個1,我不知道'subset'應該做什麼,所以我只是猜測它。我猜錯了。 – crvv

+1

@Meurth從數學角度來說,一組可以不包含重複項。在這種情況下,'sublist'可能是你的函數的更好的名字,因爲列表/序列可以包含重複項。從數學角度來看,{1,1,1}等於{1,1}等於{1}。 – Polygnome