我正在實作一個接受 a[[Int]]并回傳 a的函式[String],它需要用_s 填充每個子串列中的空白位置,該索引是輸入串列的補碼,并從串列中生成一個字串,每個字串的長度是相同的并且是(輸入數字的最大值 1)。
例如,如果輸入為[[1, 2] [0, 1, 2, 3] [1, 3] [0, 2, 3]],則輸出為["_12_", "0123", "_1_3", "0_23"]
我盡力做到這一點,不知道如何將空白插入缺失的部分。
getString :: [[Int]] -> [String]
getString x = concat. show. x insert _
where insert _ [] ys = ys
uj5u.com熱心網友回復:
打破這一點,您似乎需要找到存在的最小和最大數字。
inputs = [[1, 2], [0, 1, 2, 3], [1, 3], [0, 2, 3]]
listMin = foldl1 min
listMax = foldl1 max
minInput = listMin $ map listMin inputs
maxInput = listMax $ map listMax inputs
我們現在可以很容易地生成一個從最小值到最大值的串列。
ghci> [minInput .. maxInput]
[0,1,2,3]
所以現在我們可以inputs用串列推導來映射我們的:
[... | x <- inputs]
讓我們每次回傳一個所有數字的串列,并使用Data.Char.intToDigit它們來使它們成為字符。
ghci> [[intToDigit y | y <- [minInput..maxInput]] | x <- inputs]
["0123","0123","0123","0123"]
這看起來更接近,但我們實際上想要'_'if yis not in x。很容易elem。
ghci> :{
ghci| [[if y `elem` x then intToDigit y else '_'
ghci| | y <- [minInput..maxInput]]
ghci| | x <- inputs]
ghci| :}
["_12_","0123","_1_3","0_23"]
uj5u.com熱心網友回復:
我建議從一個更簡單的問題開始:為sublist執行此操作,因此 map [1,2]to"_12"和[1,3]to "_1_3"。稍后您可以在下劃線右側進行填充以繪制矩形矩陣。您可以使用遞回來執行此操作,其中使用累加器,每次都會檢查串列的頭部是否小于、大于或等于累加器,因此:
getRow :: [Int] -> String
getRow = go 0
where go _ [] = …
go i (x:xs)
| … = …
| otherwise = …
因此,這go是一個輔助函式。它以go 0 [1,2]. 我們看到0小于1,所以我們產生一個下劃線并前進到go 1 [1,2],因為 nowi與串列的頭部相同,我們將數字作為字符發出,等等。我將實作這些…部分作為練習。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/530204.html
標籤:列表哈斯克尔
