gpt4 book ai didi

haskell - 使用仿函数在haskell中编写XOR

转载 作者:行者123 更新时间:2023-12-01 07:06:45 25 4
gpt4 key购买 nike

我对 haskell 比较陌生,我最近才了解了 Applicative Functors,我为 xor 编写了这段代码,只有 functors 和 boolean 函数。我想知道你们是否可以用仿函数想出一个更短的解决方案(我确定存在)。

xor :: Bool->Bool->Bool
xor=(<$>) (not<$>) ((<*>).((((not<$>)<$>(&&))<$>)<$>((not<$>)<$>(&&)))<*>(||))

我知道这可能不是很好的做法;这对我来说更像是一个脑筋急转弯。

PS我希望这里允许

最佳答案

这是一个您可以想象手写的解决方案(并阅读,有一些指导!)。正如@AJFarmar 所指出的,我们可以写

xor a b = (a || b) && (not a || not b)

我也会使用他建议的重写,即 a && b = not (not a || not b) ,尽管他做了相反的事情:
xor a b = (a || b) && not (a && b)

对于其他定义,您可以遵循以下过程,但这是一个特别短的起始定义。

现在我们可以挑选出块 a || ba && b并且,不要将它们视为 Bool 类型的值在具有 a :: Bool 的环境中和 b :: Bool ,将它们转换成我们将它们视为类型 Bool 的值的形式带两个 Applicative “上下文”包装器。因此 (||) :: f (g Bool)(&&) :: f (g Bool) , 其中 fg是特定的 Applicative实例 (->) Bool .所以我们处于部分翻译状态
xor = (||) && not (&&)

现在唯一的问题是中缀 &&not期待纯 Bool值,但被双重包装 Bool s。所以我们将使用双 liftA* 来提升它们应用程序。因此:
xor = liftA2 (liftA2 (&&)) (||) (liftA (liftA not) (&&))

还有其他拼写方法。我更喜欢这个名字 (<$>)liftA .另外,可以想到双重包装 Applicative s 作为用更复杂的包装器单独包装的东西,因此:
xor = getCompose (liftA2 (&&) (Compose (||)) (not <$> Compose (&&)))

关于haskell - 使用仿函数在haskell中编写XOR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31484936/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com