我是使用 haskell 的新手,但我試圖按照這個問題的答案來創建我自己的函式,該函式將一個串列和一個元素作為輸入,并從串列中洗掉所述元素的第一個實體。
我的代碼是這樣的:
我的代碼是這樣的:
rem1 :: Eq a => [a] -> a -> [a] 。
rem1 [] _ = [] 。
rem1 ys _ = ys
rem1 (y:ys) x | x == y = ys
|否則 = y : rem1 ys x
當我在ghci中加載代碼時,代碼被編譯了,但當我測驗時,串列卻沒有變化。像這樣:
Ok, one module loaded.
ghci> rem1 "abab" 'b' 。
"abab"
當它應該是這樣:
Ok, one module loaded.
ghci> rem1 "abab" 'b' 。
"aab"
我如何解決這個問題?
uj5u.com熱心網友回復:
對于除了空串列以外的任何引數,第二種情況總是會發生:
rem1 ys _ = ys
它說 "無論引數是什么,總是回傳第一個引數"。所以它確實如此。
你可能在考慮第二種情況與第三種情況的 "比較":第三種情況在(:)上匹配,而第二種情況在 "沒有(:)時 "匹配。
但這不是模式匹配的作業方式。像ys這樣的模式可以匹配任何東西,任何東西,不管它是否是(:)建構式。所以你的第二種情況可以匹配任何引數。
要解決這個問題,只需洗掉第二個案例。你不需要它。
要解決這個問題,只需洗掉第二個案例,你不需要它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/316906.html
標籤:
下一篇:在Haskell中實作序數
