Haskell 新数据的模式匹配
我用一些函数创建了一个新类型Haskell 新数据的模式匹配,haskell,pattern-matching,Haskell,Pattern Matching,我用一些函数创建了一个新类型 data Gate = MakeGate (Bool -> Bool -> Bool) andGate = MakeGate (&&) orGate = MakeGate (||) 现在我想将这种类型添加到一个新的Eq实例中,并使用模式匹配,但实际上我收到了很多错误消息。到目前为止我所尝试的是 instace Eq Gate where MakeGate True == MakeGate True = True 错误消息是:“
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
不包装布尔值;它包装了一个函数。我不确定您将如何定义门的Eq
实例,因为您无法比较函数是否相等。不过,语法应该是
instance Eq Gate where
(MakeGate f) == (MakeGate g) = ???
?
将是实际的相等性测试,但正如我所说的,不清楚您将在这里放置什么,因为您不能使用,例如,f==g
MakeGate
不包含布尔值;它包装了一个函数。我不确定您将如何定义门的Eq
实例,因为您无法比较函数是否相等。不过,语法应该是
instance Eq Gate where
(MakeGate f) == (MakeGate g) = ???
?
将是实际的相等性测试,但正如我所说的,不清楚您将在这里放置什么,因为您不能使用,例如,f==g
您不能在Haskell中真正进行模式匹配函数
MakeGate是一个构造函数,其类型为:(Bool->Bool->Bool)->Gate
但你给了它一个嘘声(真的)。MakeGate True不进行类型检查
也许你的意思是MakeGate f==MakeGate g=f==g
或者类似的东西
我不确定您想做什么,但函数等价性并不是微不足道的,模式匹配是针对构造函数的,而不是针对函数的
我想你真正想要的是
data Gate=AndGate | OrGate |…您无法在Haskell中真正实现模式匹配函数
MakeGate是一个构造函数,其类型为:(Bool->Bool->Bool)->Gate
但你给了它一个嘘声(真的)。MakeGate True不进行类型检查
也许你的意思是MakeGate f==MakeGate g=f==g
或者类似的东西
我不确定您想做什么,但函数等价性并不是微不足道的,模式匹配是针对构造函数的,而不是针对函数的
我想你真正想要的是
data Gate=AndGate | OrGate |…您不能在Gate
类型上定义有意义的Eq
实例,因为它包含函数和
不过,更重要的是,您的问题似乎混淆了Haskell和高阶函数编程的各种不同方面。考虑找到一个课程,书籍或其他资源,以帮助你学习结构化,原则性的方式。(在堆栈溢出问题上,请求此类资源与主题无关,因此我将在这里避免提出具体建议。)您不能在门
类型上定义有意义的Eq
实例,因为它包含一个函数,并且
不过,更重要的是,您的问题似乎混淆了Haskell和高阶函数编程的各种不同方面。考虑找到一个课程,书籍或其他资源,以帮助你学习结构化,原则性的方式。(在堆栈溢出问题上,请求此类资源与主题无关,因此我将在这里避免提出具体建议。)您可能想了解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]
eqGate::GateFunc->GateFunc->Bool
方程门f g=(f英尺)=(g英尺)
其中ft=[假,真]
甚至更少的代码:
import Data.Function(on)
eqGate = on (==) ((<*> ft) . (<$> ft))
where ft = [False, True]
import Data.Function(打开)
eqGate=开启(=)((英尺)。(英尺))
其中ft=[假,真]
请注意,对于具有较小(至少有限!)输入空间的函数,以及作为Eq
实例的输出类型,这是可以做到的,但通常不能比较两个函数。此外,即使这两个函数的输入空间有限,也可能出错(因为函数可能陷入无限循环)。确定两个函数是否相等是一个无法确定的问题。您可能想知道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]
eqGate::GateFunc->GateFunc->Bool
方程门f g=(f英尺)=(g英尺)
其中ft=[假,真]
甚至更少的代码:
import Data.Function(on)
eqGate = on (==) ((<*> ft) . (<$> ft))
where ft = [False, True]
import Data.Function(打开)
eqGate=开启(=)((英尺)。(英尺))
其中ft=[假,真]
请注意,对于具有较小(至少有限!)输入空间的函数,以及作为Eq
实例的输出类型,这是可以做到的,但通常不能比较两个函数。此外,即使这两个函数的输入空间有限,也可能出错(因为函数可能陷入无限循环)。确定两个函数是否相等是一个无法确定的问题。我尝试使用可能输入的所有输出来定义运算符“==”。我尝试使用可能输入的所有输出来定义运算符“==”,这很好。但是是否可能将eqGate函数放入instace函数中?是的,使用where