2016-04-17 127 views
0

你好,我在一個編程語言類,我們剛剛介紹給Haskell。所以在作業中,我們必須創建一個可以移除列表中元素的多個實例的函數。我有一個以前的函數可以刪除一個元素,但我的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

請確保發佈StackOverflow上的問題(你可以粘貼Haskell代碼,因爲它是,然後標記所有代碼,只需按下時獲得的壓痕權'ctrl' +'k'來實現這一點)。另外,請隨時添加類型簽名! – leftaroundabout

+0

edited :)這是我的理解,類型推斷已經假定我想要做什麼。兩個返回列表。 –

+2

@KevinD我不會建議做出這樣的假設......它可能會導致怪異的類型錯誤。如果你指定了你想要的頂級綁定的類型,那麼錯誤會更加清晰(因爲你告訴類型檢查器你想要它匹配什麼)。頂級類型簽名還使代碼更易於閱讀。 –

回答

3

這個問題不保護,這是

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

將只匹配時既不列表是空的,所以在你的基地情況下,你有

removeMultipleElements [] aList 

它只與第二個定義匹配,因此變成了空列表。你應該用什麼代替

removeMultipleElements _ _ = [] 

removeMultipleElements _ xs = xs 
+0

這個技巧。非常感謝你的幫助。這真的讓我對Haskell開放了! –