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

时间:2016-04-10 15:38:14

标签: list haskell functional-programming

我目前有这段代码:

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做了一个完全不同的事情,所以此时我知道它为什么不起作用,但我不知道如何替换它。

1 个答案:

答案 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; }