我目前有这段代码:
function string keys = map (xor 1) (map ord string)
它从字符串中获取每个元素,而xor使用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做了一个完全不同的事情,所以此时我知道它为什么不起作用,但我不知道如何替换它。
答案 0 :(得分:0)
这就是类Applicative
类型的ZipList
实例正在做的事情:
> getZipList $ xor . ord <$> ZipList "Test" <*> ZipList [1,3,6,9, 11]
[85,102,117,125]
get/ZipList
用作表示我们压缩意图的标记,而不是常规列表的跨产品行为。我们应该假装 - “忽略”它们,在我们的脑海里读它而不是
-- zipWith ( xor . ord ) "Test" [1,3,6,9, 11]
与
相同-- zipWith xor (map ord "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
的同义词,map
是<*>
的同义词,ZipList
是“apply”。
如果没有 > [ord] <*> "Test"
[84,101,115,116]
-- ord <$> "Test"
-- map ord "Test"
标记,我们就会
function :: [Char] -> [Int] -> [Int]
-- function string keys = map (iterate xor keys) (map ord string)
function string keys = zipWith ($) (map xor keys) (map ord string)
-- = getZipList $ (xor <$> ZipList keys) <*> (ord <$> ZipList string)
具体来说,你的代码应该稍微调整一下
($)
($) f x = f $ x = f x
是一个应用程序运算符public AdaptadorSobres(ArrayList<Sobre> list, Context context) {
this.misSobres = list;
this.context = context;
}
。