2

我已经将以下函数写入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的新手,所以如果有一个没有太多无点魔法的简化,很高兴看到:)

4

1 回答 1

8

好吧,您可以使用onand简化您的版本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)

现在我们已经消除了这两个maps。

于 2013-09-14T20:34:07.597 回答