gpt4 book ai didi

haskell - 省略一元构造函数

转载 作者:行者123 更新时间:2023-12-02 16:34:30 25 4
gpt4 key购买 nike

我正在编写一些代码来表达由给定类型的成员构建的“表达式”:

data Expr a = Simply a | Add (Expr a, Expr a) | Mult (Expr a, Expr a) 

可以定义一些中缀运算符,以便更方便地构造它们:

(+++) :: Expr a -> Expr a -> Expr a
x +++ y = Add (x, y)

(***) :: Expr a -> Expr a -> Expr a
x *** y = Mult (x, y)

因此人们可以直接写

(Simply "bar") +++ ((Simply "fo") *** (Simply "o"))

获取

Add (Simply "bar",Mult (Simply "fo",Simply "o"))

现在的问题是是否有一种方法可以简单地省略构造函数,即将类型 a 的任何成员隐式视为 的成员>Expr a 并直接从 ("bar")+++ (("fo") *** ("o")) 获取上面的示例。

最佳答案

您可以像这样创建表达式的类型类:

class IsExpr a b | a -> b where 
ex :: a -> Expr b

这定义了一个类型 a 的类,它是类型 b 的表达式,其中 b 被声明为由 a 使用函数依赖项确定。

然后继续将 String 转换为 Expr String 类型的表达式:

instance IsExpr String String where
ex = Simply

此外,毫不奇怪,表达式也是表达式:

instance IsExpr (Expr a) a where
ex = id

现在您可以重新定义运算符,以便它们可以采用产生相同类型表达式的任意组合,即任何参数都可以是 StringExpr String 或您定义的任何 IsExpr 实例:

(++++) :: (IsExpr a c, IsExpr b c) => a -> b -> Expr c
x ++++ y = Add (ex x, ex y)

(****) :: (IsExpr a c, IsExpr b c) => a -> b -> Expr c
x **** y = Mult (ex x, ex y)

这确实需要一些扩展:TypeSynonymInstances(仅当您使用String时)、FlexibleInstancesMultiParamTypeClasses > 和FunctionalDependency。当然,存在复杂性/ yield 权衡,因此也许 yield 不值得额外的复杂性。

顺便说一句,我宁愿将数据构造函数定义为 Add (Expr a) (Expr a)。您正在添加一个 使用元组进行额外的间接寻址。

关于haskell - 省略一元构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23391740/

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