如何将mod应用于Haskell中列表中的每个元素

时间:2017-10-31 15:15:29

标签: list haskell mod

我有一个函数可以生成我想要应用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应用于almostVig生成的列表中的每个元素。我尝试在adjust中使用zipWith作为let adjust m = zipWith (mod (almostVig m) 26),但这也失败了。如何将mod应用于列表中的每个元素以生成一个新元素,其中没有元素大于25?

2 个答案:

答案 0 :(得分:5)

您可以使用map

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

map的类型为(a -> b) -> [a] -> [b]:它需要一个函数并将其应用于元素列表。

`mod` 26是部分函数应用程序:它将函数mod转换为运算符`mod`,以便可以内联使用,例如128 `mod` 26而不是mod 128 26 },然后部分应用第二个参数。

答案 1 :(得分:2)

使用列表理解。

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

这将产生一个新列表,其中所有元素都将小于26