想象一下,您有一個像這樣的二維串列:
[[1, 3, 2, 4, 5, 6, 9, 3], [3, 2, 4, 1, 6, 8, 7, 0, 9], ....]
我想獲取.0array -> (1, 7)
我試過使用mapand elemIndex。
uj5u.com熱心網友回復:
兩者elemIndex和map對于解決這個問題都是不必要的。您只需要跟蹤一組起始坐標并在遞回遍歷串列時對其進行修改。
顯然,我們要查找的值永遠不會在空串列中,因此 case 將回傳Nothing。
如果串列中的第一個串列為空,它也不存在,所以我們轉到下一個串列,增加第一個坐標并將第二個坐標重置為0.
如果第一個串列不為空,我們檢查它的第一個元素是否是我們正在尋找的元素。如果是,我們可以回傳用 包裹的坐標Just,遞回結束。
否則,繼續增加第二個坐標并考慮串列串列的其余部分。
findCoords :: Eq a => (Int, Int) -> a -> [[a]] -> Maybe (Int, Int)
findCoords _ _ [] = Nothing
findCoords (i, _) v ([]:xs) = findCoords (i 1, 0) v xs
findCoords (i, j) v ((x:y):xs)
| v == x = Just (i, j)
| otherwise = findCoords (i, j 1) v (y:xs)
(0, 0)這需要在呼叫時手動傳遞。這可以通過使用本地aux函式來清除。
findCoords :: Eq a => a -> [[a]] -> Maybe (Int, Int)
findCoords = aux (0, 0)
where
aux _ _ [] = Nothing
aux (i, _) v ([]:xs) = aux (i 1, 0) v xs
aux (i, j) v ((x:y):xs)
| v == x = Just (i, j)
| otherwise = aux (i, j 1) v (y:xs)
uj5u.com熱心網友回復:
當您嘗試對多個專案做某事時,首先要弄清楚如何對一個專案做某事。然后將您的功能映射到所有專案。
讓我們選擇這個串列:[3, 2, 4, 1, 6, 8, 7, 0, 9]
elemIndex 的型別可以在 GHCi 中使用:t.
:m Data.List -- load module
:t elemIndex -- show type
這回傳elemIndex :: Eq a => a -> [a] -> Maybe Int
所以,我們給它一個值和一個串列,它回傳一個 Maybe 的索引。
elemIndex 0 [3, 2, 4, 1, 6, 8, 7, 0, 9] -- returns Just 7
也許我們稱這個函式f
f = elemIndex 0
然后我們將這個函式映射到串列串列中。
result = map f lst
最大的問題是你所說的第一個值是什么意思。如果你有一個類似的串列[[1,2,3,0],[0,1,2,3]],第一個值是哪個?這將告知您如何處理地圖的結果。
您處理Maybe Int, 的方式是匹配兩個值Just xand的最簡單級別Nothing。
f :: Maybe Int -> String
f (Just x) = show x
f Nothing = "Nothing"
main = do
putStrLn $ f (Just 3)
putStrLn $ f (Nothing)
使用這些想法,我撰寫了這段代碼,它似乎可以滿足要求。映射elemIndex完串列后,我找到了第一個匹配串列,使用findIndex. 該函式findIndex接受一個謂詞 for Just x,如果是則回傳True,以及Falsefor Nothing。那么這只是一個匹配Just并Nothing提取結果的情況。
import Data.List
lst=[[1, 3, 2, 4, 5, 6, 9, 3], [3, 2, 4, 1, 6, 8, 7, 0, 9]]
f = elemIndex 0
pJust :: Maybe a -> Bool
pJust (Just x) = True
pJust Nothing = False
main = do
let results = map f lst
let location = findIndex pJust results
case location of
Just index -> do
let location2 = results !! index
case location2 of
Just index2 -> putStrLn $ "("
show index ","
show index2 ")"
Nothing -> putStrLn "Search failed"
Nothing -> putStrLn "Search failed"
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/517131.html
標籤:列表哈斯克尔
下一篇:脫糖Do-Notation函式
