List 使用不同的函数将映射应用于列表的每个元素

List 使用不同的函数将映射应用于列表的每个元素,list,haskell,functional-programming,List,Haskell,Functional Programming,我目前有以下代码: function string keys = map (xor 1) (map ord string) 它从字符串中提取每个元素,并将其与1进行异或运算。 我想通过将1替换为键中的任何元素,使映射功能更高级 例如,如果string==“Test”和keys=[1,3,6,9]我会得到: 'T' xor 1 'e' xor 3 's' xor 6 't' xor 9 有没有一种方法可以迭代键的所有元素,这样我就可以实现这一点?我是Haskell的新手,对它的概念没有很好的理

我目前有以下代码:

function string keys = map (xor 1) (map ord string)
它从字符串中提取每个元素,并将其与1进行异或运算。 我想通过将1替换为键中的任何元素,使映射功能更高级

例如,如果
string==“Test”
keys=[1,3,6,9]
我会得到:

'T' xor 1
'e' xor 3
's' xor 6
't' xor 9
有没有一种方法可以迭代键的所有元素,这样我就可以实现这一点?我是Haskell的新手,对它的概念没有很好的理解

我试图解决这个问题是:

function string keys = map (iterate xor keys) (map ord string)
但我有一些错误,我想这是因为迭代函数

任何帮助都将不胜感激



正如我发布的一样,我注意到iterate做了一件完全不同的事情,因此在这一点上我知道它为什么不起作用,但我不知道如何替换它。

您想将列表的一个元素与另一个列表的一个元素相关联。 这通常被称为拉链。这似乎正是您想要的:

Prelude Data.Bits> zipWith xor [1, 3, 5] [10, 23, 44]
[11,20,41]
它接受一个
a->b->c
函数、一个
[a]
列表和一个
[b]
列表,并使用两个列表中的相应元素明智地应用函数元素


它是
zip
函数的泛化,该函数生成元素对(
zip=zipWith(,)
)。

您希望将列表的一个元素与另一个列表的一个元素相关联。 这通常被称为拉链。这似乎正是您想要的:

Prelude Data.Bits> zipWith xor [1, 3, 5] [10, 23, 44]
[11,20,41]
它接受一个
a->b->c
函数、一个
[a]
列表和一个
[b]
列表,并使用两个列表中的相应元素明智地应用函数元素


它是生成成对元素(
zip=zipWith(,)
)的
zip
函数的泛化。

类型类的
ZipList
实例就是这样做的:

>getZipList$xor。ord ZipList“测试”ZipList[1,3,6,9,11]
[85,102,117,125]
get/ZipList
s作为一种标记来表示我们的zip意图,而不是常规列表的跨产品行为。我们应该假装--“忽略”他们,在我们的脑海里读它,而不是像

——zipWith(xor.ord)“测试”[1,3,6,9,11]
这和

——带xor的zipWith(映射词“Test”)[1,3,6,9,11]
--zipWith($)(map(xor.ord)“Test”)[1,3,6,9,11]
--map(uncurry($)(zip(map(xor.ord)“Test”)[1,3,6,9,11])
--map(\(a,b)->xor(ord a)b)(zip“Test”[1,3,6,9,11])
fmap
的同义词,fmap是
map
的同义词,
是“应用”

如果没有
ZipList
标记,我们可以

[ord]“测试”
[84,101,115,116]
--ord“测试”
--地图“测试”
具体来说,您的代码应该稍微调整一下

函数::[Char]->[Int]->[Int]
--函数字符串键=映射(迭代异或键)(映射ord字符串)
函数字符串keys=zipWith($)(映射异或键)(映射ord字符串)
--=getZipList$(xor ZipList键)(ord ZipList字符串)

($)
是一个应用程序操作符,
($)fx=f$x=fx

类型类的
ZipList
实例就是这样做的:

>getZipList$xor。ord ZipList“测试”ZipList[1,3,6,9,11]
[85,102,117,125]
get/ZipList
s作为一种标记来表示我们的zip意图,而不是常规列表的跨产品行为。我们应该假装--“忽略”他们,在我们的脑海里读它,而不是像

——zipWith(xor.ord)“测试”[1,3,6,9,11]
这和

——带xor的zipWith(映射词“Test”)[1,3,6,9,11]
--zipWith($)(map(xor.ord)“Test”)[1,3,6,9,11]
--map(uncurry($)(zip(map(xor.ord)“Test”)[1,3,6,9,11])
--map(\(a,b)->xor(ord a)b)(zip“Test”[1,3,6,9,11])
fmap
的同义词,fmap是
map
的同义词,
是“应用”

如果没有
ZipList
标记,我们可以

[ord]“测试”
[84,101,115,116]
--ord“测试”
--地图“测试”
具体来说,您的代码应该稍微调整一下

函数::[Char]->[Int]->[Int]
--函数字符串键=映射(迭代异或键)(映射ord字符串)
函数字符串keys=zipWith($)(映射异或键)(映射ord字符串)
--=getZipList$(xor ZipList键)(ord ZipList字符串)

($)
是一名应用程序操作员,
($)fx=fx=fx

非常感谢您,这正是我要找的!有没有一个好地方可以让我找到我可以学习的类似函数?不一定是做同样事情的函数,但对初学者来说很有用。@Xzenon您可以使用它按名称或类型查找函数。例如,在您的案例中,您需要类型为
(a->a->a)->[a]->[a]->[a]->[a]
的东西,搜索生成的东西,您可以看到它们之间的
zipWith
。此外,您还应该查看
Prelude
模块以查看最有用的功能。非常感谢您,这正是我想要的!有没有一个好地方可以让我找到我可以学习的类似函数?不一定是做同样事情的函数,但对初学者来说很有用。@Xzenon您可以使用它按名称或类型查找函数。例如,在您的案例中,您需要类型为
(a->a->a)->[a]->[a]->[a]->[a]
的东西,搜索生成的东西,您可以看到它们之间的
zipWith
。此外,您还应检查
Prelude
模块以查看最有用的功能。