在haskell中使用数据类型

在haskell中使用数据类型,haskell,Haskell,所以我这里有一个代码(Haskell),我想弄清楚,我到处都在寻找解决方案,但找不到任何解决方案 data Expr = Var String | Const Int | Neg Expr | Expr `Plus` Expr | Expr `Times` Expr deriving (Show,Eq) transform::(Expr->Expr)->Expr->Expr transform t (Neg e) = t (Neg(transform t e))

所以我这里有一个代码(Haskell),我想弄清楚,我到处都在寻找解决方案,但找不到任何解决方案

data Expr = Var String | Const Int | Neg Expr | Expr `Plus` Expr | Expr `Times` Expr 
     deriving (Show,Eq)

transform::(Expr->Expr)->Expr->Expr
transform t (Neg e) = t (Neg(transform t e))
transform t (e1 `Plus` e2) = t ((transform t e1) `Plus` transform t e2)
transform t e = t e

sublocal :: (String->Expr)->Expr->Expr
sublocal t (Var s) = t s
sublocal t exp = exp

substitute :: (String->Expr)->Expr->Expr
substitute t exp = transform (sublocal t) exp

reduce :: Expr->Expr
reduce (Neg(Const x)) = Const(-x)
reduce ((Const x) `Plus` (Const y)) = Const(x+y)
reduce e = e

simplify ::(String ->Expr)->Expr->Expr
simplify t e = transform reduce (substitute t e)
我不明白这一点:

transform::(Expr->Expr)->Expr->Expr
transform t (Neg e) = t (Neg(transform t e))
transform t (e1 `Plus` e2) = t ((transform t e1) `Plus` transform t e2)
transform t e = t e
此功能可以接收哪些有效输入以使其工作?你能给我看一些有效的输入来让这个功能工作吗?
我不明白要传递给函数什么值来匹配此定义:
(Expr->Expr)

transform
接受两个参数

  • 接受
    Expr
    并返回
    Expr
    的函数(任何函数)
  • 用于应用此功能的
    Expr
这个想法似乎类似于映射:获取一个函数并将其应用于某个对象的每个部分。(尽管如前所述,它只处理
Neg
Plus

您可以尝试
id
功能,该功能不会执行任何操作:

> transform id (Neg (Const 5))
Neg (Const 5)
或者您可以应用一些更有趣的功能:

> transform reduce (Neg (Const 5))
Const (-5)

类型
Expr
定义了一个抽象语法树:描述非常简单的表达式语言的解析形式的数据结构

您可以定义将
Expr
作为参数的函数,对其执行一些操作,并返回另一个
Expr
作为其结果。代码示例中的函数
reduce
就是其中之一——如果树的根是它可以“reduce”的东西,它将这样做,否则它将返回未经处理的输入

函数
transform
采用类似于
reduce
的函数,并返回另一个函数。具体地说,对于
reduce
能够减少的确切情况,
transform
递归地应用输入函数,以便在将输入函数应用于
Neg
Plus
节点本身之前,首先“转换”
Neg
Plus
情况的子树


结果是:如果您仅使用
Plus
Neg
节点组成
Expr
树,并且只使用
Const
叶,则应用
transform reduce
将“减少”整个树,返回一个
Const
值,该值包含对输入树描述的表达式求值的结果。

(Expr->Expr)
只是一个函数类型,因此最简单的方法是传递只返回其参数的函数
id
,因此
转换id
将是一个“不做任何事情”的操作。您可以有类似于
incrConst(Const a)=Const(a+1);incrConst other=other
,因此
transform incrConst
将是一个函数
Expr->Expr
,它将递增
Const
构造函数中包装的所有值。@bheklillr您能给我一个完整的
transform
输入吗?定义
inscrConst
并执行
transform incrConst
给了我以下错误:没有(Show(Expr->Expr))的实例(可能您没有向函数应用足够的参数?)您必须完全应用该函数
transform
包含两个参数,是一个高阶函数,如
map
filter
。类似于
transformincrconst(Const 1)
的东西将返回
Const 2
,尽管它不是很有趣。但是,
transformincrconst(Plus(Const 1)(Const 2))
将返回
Plus(Const 2)(Const 3)
不要把它当回事。如果你理解这里的各个部分(我希望熟悉Haskell的人都能轻松做到),但不理解它们是如何结合在一起的,那么你应该以一种反映和证明这一点的方式来写你的问题。您说您“到处搜索解决方案”,但不是您做了什么,也没有设法弄清楚代码的作用。在本例中:
transform id(Neg(Const 5))
from
transform
函数接受我传递的
id
参数?是。第一个参数指向第一个参数。