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
模块以查看最有用的功能。