簡體   English   中英

如何將 function 應用於列表中元組中的特定元素

[英]How to apply a function to a specific element in tuples in a list

我有一個([Char], Int, Int)類型的元組列表,我想修改每個元組(_, x, _)的第一個 integer 的值,以便該值枚舉項目從1開始:

function [("hi", 4, 2), ("hi", 27, 3) , ("moon", 9, 2)]
> result: [("hi", 1, 2), ("hi", 2, 3), ("moon", 3, 2)]

我怎樣才能做到這一點?

根據您的示例(文本確實令人困惑-我希望我可以稍微修復一下),您可以使用列表理解 + zip

enumItems :: [(String, Int, Int)] -> [(String, Int, Int)]
enumItems items = [ (str, i, n) |  ((str,_,n), i) <- zip items [1..] ]

你的例子:

Prelude> enumItems [("hi", 4, 2), ("hi", 27,3) , ("moon", 9, 2)]
[("hi",1,2),("hi",2,3),("moon",3,2)]

如果您願意,還有zipWith

enumItems :: [(String, Int, Int)] -> [(String, Int, Int)]
enumItems items = zipWith (\(str, _, n) i -> (str, i, n)) items [1..]

如果你翻轉items的順序和[1..]你可以有一個很好的無點(意思是:不需要items )版本:

enumItems :: [(String, Int, Int)] -> [(String, Int, Int)]
enumItems = zipWith (\i (str, _, n) -> (str, i, n)) [1..]

這可能是我會使用的版本。


兩種變體都使用了一個巧妙的小技巧:由於 Haskell 是懶惰的,因此您可以在zip中無限列表[1..] = [1,2,3,4,...]在任何列表[i1,i2,i3,...]並得到對[(i1,1),(i2,2),...]另一個列表的長度無關緊要。

AFAIK 也沒有像mapi等變體。你有時會在其他語言中看到帶有索引的map - 它總是那個技巧(至少我在這些情況下經常使用這個技巧)

Data.List.Index中有indexed它允許您將索引附加到列表的每個元素。 因此,在您的情況下,您將得到一個[(Int, ([Char], b, c))] ,您只需編寫一個 function 來重新組織元組,如下所示:

import Data.List.Index (indexed)

rearrange (i,(s,_,j)) = (s,i,j)
function = map rearrange . indexed

input = [("hi", 4, 2), ("hi", 27, 3) , ("moon", 9, 2)]
result = function input

這樣,您就可以從 0 開始索引元素。如果您希望它們從 1 開始,您只需更改一位:

rearrange (i,(s,_,j)) = (s,i+1,j)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM