2016-04-17 19 views
0

こんにちは私はちょうどHaskellに導入されたプログラミング言語のクラスです。宿題では、リスト内の要素の複数のインスタンスを削除できる関数を作成する必要がありました。私は1つの要素を削除することができる以前の関数を持っていましたが、removeMultipleElementsはガードされたステートメントを実行して空のリストにまっすぐに行きたくはありません。どんな助けもありがとうございます。私は文法的なものだと確信していますが、私は何がわかりません。保護された文が実行されないのはなぜですか?

は、ここでは、コード

--This one works great  
removeElement x [email protected](y:ys) 
     | y == x = rest 
     | otherwise = y : rest 
      where 
      rest = removeElement x ys 
    removeElement _ _ = [] 

--this does not want to 
removeMultipleElements [email protected](y:ys) [email protected](x:xs) 
     | elem y aList = removeMultipleElements ys (removeElement y aList) 
     | not (elem y aList) = removeMultipleElements ys aList 
     | otherwise = aList 
removeMultipleElements _ _ = [] 
+3

ようなもので

removeMultipleElements _ _ = [] 

を交換する必要がありますこれを達成するために 'ctrl' +' k')。また、常にタイプシグネチャを追加してください! – leftaroundabout

+0

編集:)型推論はすでに私がやりたいことを想定していることは私の理解であった。どちらもリターンリストです。 –

+2

@KevinD私はその仮定をすることを提案しません...それはより奇妙に見えるタイプのエラーにつながる可能性があります。最上位レベルのバインディングのタイプを指定すると、エラーがはっきりとわかります(タイプチェッカーに一致させたいものを伝えているため)。トップレベルのタイプのシグネチャも、コードを読みやすくします。 –

答えて

3

は問題がガードではありませんが、それはどちらのリストが空の場合

removeMultipleElements [email protected](y:ys) [email protected](x:xs) 

のみが一致するということですので、あなたのベースケースであなたは

を持っています
removeMultipleElements [] aList 

2番目の定義とのみ一致するため、空のリストになります。おそらく、それがあるとして、あなたがHaskellコードを貼り付けることができます(StackOverflowの質問を投稿する権利たときにインデントを取得することを確認し、すべてのコードと押すだけをマークしてください

removeMultipleElements _ xs = xs 
+0

それはトリックでした。手伝ってくれてどうもありがとう。これは本当にハスケルに私の目を開いた! –

関連する問題