如何将 mod 应用于 Haskell 列表中的每个元素
How to apply mod to every element in a list in Haskell
我有一个生成整数列表的函数,我想对其应用 mod,以便列表中的元素不大于 25。例如,列表 [6,8,18, 28,14,25] 应该 return 为 [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 应用于 almostVig 生成的列表中的每个元素。我曾尝试在 adjust
中将 zipWith 用作 let adjust m = zipWith (mod (almostVig m) 26)
,但也失败了。如何将 mod
应用于列表中的每个元素以生成一个新列表,其中没有元素大于 25?
使用列表理解。
[x `mod` 26 | x <- almostVig]
这将生成一个新列表,其中所有元素都将小于 26
。
您可以使用 map
:
let adjust m = map (`mod` 26) (almostVig m)
map
具有类型 (a -> b) -> [a] -> [b]
:它接受一个函数并将其按元素应用于列表。
`mod` 26
是部分函数应用:它将函数 mod
转换为运算符 `mod`
以便它可以内联使用,例如 128 `mod` 26
而不是 mod 128 26
,然后部分应用第二个参数。
我有一个生成整数列表的函数,我想对其应用 mod,以便列表中的元素不大于 25。例如,列表 [6,8,18, 28,14,25] 应该 return 为 [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 应用于 almostVig 生成的列表中的每个元素。我曾尝试在 adjust
中将 zipWith 用作 let adjust m = zipWith (mod (almostVig m) 26)
,但也失败了。如何将 mod
应用于列表中的每个元素以生成一个新列表,其中没有元素大于 25?
使用列表理解。
[x `mod` 26 | x <- almostVig]
这将生成一个新列表,其中所有元素都将小于 26
。
您可以使用 map
:
let adjust m = map (`mod` 26) (almostVig m)
map
具有类型 (a -> b) -> [a] -> [b]
:它接受一个函数并将其按元素应用于列表。
`mod` 26
是部分函数应用:它将函数 mod
转换为运算符 `mod`
以便它可以内联使用,例如 128 `mod` 26
而不是 mod 128 26
,然后部分应用第二个参数。