gpt4 book ai didi

haskell - 新数据的模式匹配

转载 作者:行者123 更新时间:2023-12-05 09:15:48 26 4
gpt4 key购买 nike

我创建了一个具有一些功能的新类型

data Gate = MakeGate (Bool -> Bool -> Bool)
andGate = MakeGate (&&)
orGate = MakeGate (||)

现在我想将此类型添加到具有模式匹配的 Eq 的新实例,但实际上我收到了很多错误消息。到目前为止我尝试的是

instace Eq Gate where
MakeGate True == MakeGate True = True

错误消息是:“无法将预期类型‘Bool -> Bool -> Bool’与实际类型‘Bool’匹配”我在想 Bool -> Bool -> Bool 的意思类似于 (&&) 或 (||) 函数。但它不是那样工作的。

我错过了什么?

最佳答案

您可能想知道 MakeGate 数据构造函数包装的两个 函数 是否总是对相同的输入产生相同的结果。

我们只能通过执行详尽搜索来找出这一点:为两个函数计算所有可能输入的结果,并每次比较输出。因此我们可以这样写:

type GateFunc = Bool -> Bool -> Bool

eqGate :: GateFunc -> GateFunc -> Bool
eqGate f g = f False False == g False False
&& f False True == g False True
&& f True False == g True False
&& f True True == g True True

然后写成:

instance Eq Gate where
MakeGate f == MakeGate g = eqGate f g

然而,上面的代码并不是很优雅:我们可以通过生成列表来做得更好:

eqGate :: GateFunc -> GateFunc -> Bool
eqGate f g = (f <$> ft <*> ft) == (g <$> ft <*> ft)
where ft = [False, True]

或者更少的代码:

import Data.Function(on)

eqGate = on (==) ((<*> ft) . (<$> ft))
where ft = [False, True]

请注意,对于具有较小(至少是有限!)输入空间且输出类型为 Eq 实例的函数,可以这样做,但通常一个人不能比较两个功能。此外,即使这两个函数的输入空间有限,也可能出错(因为函数可能陷入无限循环)。确定两个函数是否相等是一个不可判定问题。

关于haskell - 新数据的模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51792841/

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