我已经将以下函数写入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
进行压缩工作。
是否存在一些涉及zipWith
和map
的有用身份/公式?
我是Haskell的新手,所以如果有一个没有太多无点魔法的简化,那么很高兴看到:)
答案 0 :(得分:8)
嗯,您可以使用on
和fmap
简化您的版本:
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
。