簡體   English   中英

如何將 mod 應用於 Haskell 列表中的每個元素

[英]How to apply mod to every element in a list in Haskell

我有一個生成整數列表的函數,我想對其應用 mod,以便列表中的任何元素都不大於 25。例如,列表 [6,8,18,28,14,25] 應返回為[6,8,18,2,14,25]。 到目前為止的代碼如下。

let charIntList = zip ['a'..'z'] [0..25]
let getIntFromList (x:xs) a = if fst x == a then snd x else getIntFromList xs a
charToInt :: Char -> Int
let charToInt a = getIntFromList charIntList a
zipWithPosition :: [Char] -> [(Char, Int)]
let zipWithPosition m = zip m [0..length m]
position :: [(Char, Int)] -> [Int]
let position m = map snd (zipWithPosition m)
messToInt :: [Char] -> [Int]
let messToInt m = map charToInt m
almostVig :: [Int] [Int] -> [Int]
let almostVig m = zipWith (+) (messToInt m) (position m)
adjust :: [Int] -> [Int]
let adjust m = (mod (almostVig m) 26)

此代碼無法將 mod 應用於由幾乎Vig 生成的列表中的每個元素。 我試過在adjust使用 zipWith as let adjust m = zipWith (mod (almostVig m) 26) ,但也失敗了。 如何將mod應用於列表中的每個元素以生成一個新列表,其中沒有元素大於 25?

您可以使用map

let adjust m = map (`mod` 26) (almostVig m)

map具有類型(a -> b) -> [a] -> [b] :它接受一個函數並將其應用於列表元素。

`mod` 26是部分函數應用:它將函數mod轉換為運算符`mod`以便可以內聯使用,例如128 `mod` 26而不是mod 128 26 ,然后部分應用第二個參數。

使用列表理解。

[x `mod` 26 | x <- almostVig]

這將產生一個新列表,其中所有元素都將小於26

暫無
暫無

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

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