简化xoring字符串

时间:2013-09-14 20:17:45

标签: haskell pointfree

我已经将以下函数写入xor两个字符串但感觉应该可以写得更简单:

import Data.Bits (xor)
import Data.Char (ord, chr)

-- xors strings of equal length
stringXor :: String -> String -> String
stringXor s t = map chr $ zipWith xor (f s) (f t) where
    f = map ord

看起来你应该至少不能拥有第一个map,但我无法使用合成chr . xor进行压缩工作。

是否存在一些涉及zipWithmap的有用身份/公式?

我是Haskell的新手,所以如果有一个没有太多无点魔法的简化,那么很高兴看到:)

1 个答案:

答案 0 :(得分:8)

嗯,您可以使用onfmap简化您的版本:

import Data.Function (on)

stringXor :: String -> String -> String
stringXor = zipWith (fmap chr . xor) `on` map ord

fmap chr .也可以是(chr.) .,但我发现第一个更方便输入。

修改

您甚至可以将其简化为:

stringXor = zipWith (fmap chr . xor `on` ord)

现在我们已经淘汰了两个map