中的group函式Data.List可以對串列中的相同元素進行分組輸入:
import Data.List(group)
group "mississippi time"
輸出:
["m","i","ss","i","ss","i","pp","i"," ","t","i","m","e"]
如何修改group函式以將不同的相鄰元素組合在一起?
預計:
["mi","ss","i","ss","i","pp","i time"]
以下是我的錯誤解決方案。
我嘗試對相同的元素進行分組,然后對不同的元素進行分組。在對不同元素進行分組時,我還會檢查每個元素的長度。由于 after groupSame,不同的元素被單獨留下。
-- |
-- >>> groupSame "mississippi time"
-- ["m","i","ss","i","ss","i","pp","i"," ","t","i","m","e"]
groupSame :: String -> [String]
groupSame [] = []
groupSame (x:xs) = (x : takeWhile (== x) xs) : groupSame (dropWhile (== x) xs)
-- >>> groupDiff ["m","i","ss","i","ss","i","pp","i"," ","t","i","m","e"]
-- ["mi","ss","i","ss","i","pp","i time"]
groupDiff :: [String] -> [String]
groupDiff [] = []
groupDiff [x] = [x]
groupDiff (x:y:xs)
|length x > 1 && length y > 1 = x:y : groupDiff xs
|length x > 1 && length y ==1 = x: groupDiff (y:xs)
|length x ==1 && length y > 1 = x:y: groupDiff xs
|length x ==1 && length y ==1 = (x y): groupDiff xs
預期的輸出高于groupDiff簽名。但是我得到了:
["mi","ss","i","ss","i","pp","i"," t","im","e"]
uj5u.com熱心網友回復:
那這個呢?
map concat $ groupBy (\x y -> all ((== 1) . length) [x, y]) $ group "mississippi time"
我想lambda可以以某種方式縮短。
估計(== 1) . length可以取名isSingleton。
而且,它可以被實作為null . tail節省一些括號,fwiw:
map concat $ groupBy (\x y -> all (null . tail) [x, y]) $ group "mississippi time"
再玩一些,您甚至可以擺脫變數x并y以無點風格撰寫它,前提是您撰寫了allfor pairs 的替代方案,
all' p (a, b) = p a && p b
map concat $ groupBy (curry $ all' (null . tail)) $ group "mississippi time"
但這可能不太可讀。
你import Data.List (groupBy)也需要。
其他人在評論中向您解釋了為什么您的解決方案不起作用。
然而,我的觀點是,您首先不應該尋求如此復雜的解決方案。
手工遞回是一個強大的工具,但對于這樣一個簡單的品嘗來說,它的功能實在是太強大了;事實上,你會迷失在細節中。
如果您知道您只是想以某種方式對事物進行分組,那么請使用用于分組的函式,例如groupand groupBy,看看如何將它們組合在一起以獲得您想要的。
這就是我制定解決方案的方式(從性能方面來說,這可能不是最佳的),只需寫下我想做的事情,
- 按相等對字母進行分組(從而獲得不同長度的字串)
- 將長度為 1 的相鄰字串組合在一起
- 連接每個組中的字串
然后從我的計劃的關鍵部分中提取我需要的功能:
- 按平等分組:就是
group這樣 - 長度為 1 的字串分組:
groupBy允許給定除相等性以外的謂詞分組,length可以計算長度,并(== 1)用于檢查數字是否為 1 - 連接字串:
concat這樣做(對于任何串列,不僅僅是字串,順便說一句) - 在每個組中:這意味著我必須
map在組串列中。
鑒于上述情況,我來到了這里:
map concat $ groupBy (\x y -> doTheyGoTogether) $ group "mississippi time"
我知道doTheyGoTogether會(== 1) . length以某種方式使用的地方。理解這對于所有和:來說都(== 1) . length應該是正確的,這并不是一個巨大的飛躍。xydoTheyGoTogether = all ((== 1) . length)
PS:Hoogle是你的朋友。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/488477.html
標籤:哈斯克尔
