2017-05-30 7 views
0

私はハスケルを初め、いくつかの簡単な演習をしています。この練習では、あるリストが再帰を使って別のリストのサブセットであるかどうかをチェックする関数を書いています。ここで非常にシンプルな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 

を?

このプログラムは唯一私が「YS」に「(XのYSを削除)」に変更するときに動作しますが、それは行うことになっているもの行いません。

事前に感謝の意を表します。

+2

「削除」はどこに定義されていますか?ところでhttp://hackage.haskell.org/package/base-4.9.1.0/docs/Data-List.html#v:delete – Polygnome

+0

'if'は' elem x ys && subset ... 'のように読みやすい形式で書き直すことができます。通常、Haskellでは '== False'と' if..then False'を避ける傾向があります。また、 'tail xs'は間違っています。代わりに' xs'をしたくないのですか? – Meurth

+0

:私はHaskellでは組み込み関数だったという印象の下にあった – chi

答えて

3

deleteは、インポートする必要があります。 https://www.haskell.org/hoogle/?hoogle=deleteによれば、先頭にimport Data.Listを追加する必要があります。

以外にも、私はあなたの関数subsetが間違っていると思います。 subset [1, 2, 1] [1, 2, 3]の結果はFalseです。

+0

ありがとう、私はそれをインポートする必要があるか分からなかった。私はあなたの例では2番目のリストに1つしかないので、その結果は偽であるはずだと思います。 – Meurth

+0

'サブセット'が何をするべきかわからないので、私はそれを推測します。私は間違っていると思った。 – crvv

+1

@Meurth集合は、数学的に言えば、重複を含むことはできません。その場合、リスト/シーケンスに重複が含まれている可能性があるため、 'sublist'はおそらく関数のより良い名前になります。数学的観点から、{1,1}は{1,1}が{1}に等しくなる。 – Polygnome

関連する問題