gpt4 book ai didi

haskell - 与函数实例化显示的奇怪模式匹配

转载 作者:行者123 更新时间:2023-12-03 14:57:39 24 4
gpt4 key购买 nike

所以我正在编写一个程序,它返回一个给定算术问题的过程,所以我想实例化几个函数来显示,以便我可以打印我在测试时评估的相同表达式。问题是给定的代码匹配 (-) 到第一行,而它应该落在第二行。

{-# OPTIONS_GHC -XFlexibleInstances #-}

instance Show (t -> t-> t) where
show (+) = "plus"
show (-) = "minus"

main = print [(+),(-)]

返回
[plus,plus]

我只是首先犯了一个大罪打印功能,还是有什么方法可以让它正确匹配?

编辑:我意识到我收到以下警告:
Warning: Pattern match(es) are overlapped
In the definition of `show': show - = ...

我仍然不知道它为什么重叠,或者如何阻止它。

最佳答案

sepp2k MtnViewMark 说,您不能对标识符的值进行模式匹配,只能在构造函数上进行模式匹配,在某些情况下,还可以进行隐式相等检查。因此,您的实例将任何参数绑定(bind)到标识符,在处理 (+) 的外部定义的过程中.不幸的是,这意味着您尝试做的事情不会也永远不会奏效。

您想要完成的典型解决方案是定义“算术表达式”代数数据类型,并使用适当的 show实例。请注意,您可以将表达式类型本身设置为 Num 的实例。 , 数字文字包含在“文字”构造函数中,以及像 (+) 这样的操作返回它们的参数以及操作的构造函数。这是一个快速但不完整的示例:

data Expression a = Literal a
| Sum (Expression a) (Expression a)
| Product (Expression a) (Expression a)
deriving (Eq, Ord, Show)

instance (Num a) => Num (Expression a) where
x + y = Sum x y
x * y = Product x y
fromInteger x = Literal (fromInteger x)

evaluate (Literal x) = x
evaluate (Sum x y) = evaluate x + evaluate y
evaluate (Product x y) = evaluate x * evaluate y

integer :: Integer
integer = (1 + 2) * 3 + 4

expr :: Expression Integer
expr = (1 + 2) * 3 + 4

在 GHCi 中试用:
> integer
13
> evaluate expr
13
> expr
Sum (Product (Sum (Literal 1) (Literal 2)) (Literal 3)) (Literal 4)

关于haskell - 与函数实例化显示的奇怪模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2731073/

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