我需要撰寫一段代碼,洗掉串列中第一個出現的給定元素。到目前為止,我只設法使代碼洗掉了給定元素的每次出現。
這是我現在的代碼:
rem2 :: Eq a => [a] -> a -> [a] 。
rem2 xs y = [x | x <- xs, x /= y] 。
如果我嘗試:
rem2 "hello"/span> 'l'
該代碼將回傳 "heo",而我希望它回傳 "helo"。誰能幫助我?
uj5u.com熱心網友回復:
你可以在這里使用遞回作業。如果你到達了串列的末尾,那么你回傳一個空的串列(1);如果你得到一個非空的串列(x:xs),并且串列的頭部x與我們要找的專案匹配(2),我們回傳串列的尾部xs;如果專案不匹配(3),我們產生x并遞回到串列的尾部xs。
這個函式看起來就像:
rem1 :: Eq a => [a] -> a -> [a] 。
rem1 ls y = go ls
where go [] = ... -- (1)
go (x:xs) | ... = ... -- (2)
|否則 = ... -- (3)
我把實作...部分作為一個練習。
uj5u.com熱心網友回復:
下面是一個簡化的delete的定義:
delete :: a -> [a] -> [a]
delete _ [] = []
delete x (y:ys) = if x == y then ys else y : delete x ys
它使用了實際庫中更通用的函式deleteBy。這里是源代碼.
uj5u.com熱心網友回復:
找到了一個可能的解決方案,但不完全是我想要的。解決辦法如下:
import Data.List
rem1 :: Eq a => [a] -> a -> [a] 。
rem1 xs y = delete y xs
因此,如果有人有一個不包括內置函式的解決方案,我很樂意聽取你的意見。
uj5u.com熱心網友回復:
這里有一個好奇的解決方案,按照你的要求使用串列理解法:
remfst :: Eq a => a -> [a] -> [a] 。
remfst a xs
| (j:_) <-
[i | (x,i) <- zip xs [0...], i <- [i | x == a] ]
= [ x | (x,i) <- zip xs [0. ], x <- [x | i /= j ]]
remfst _ xs = xs
這是否 "令人厭惡"?在生產代碼中,當然。在這里,它只是一個值得深思的問題。
現在,我們有
> remfst 'l' "helalo"
"healo"。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/316905.html
標籤:
