在haskell中使用数据类型
所以我这里有一个代码(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))
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))
fromtransform
函数接受我传递的id
参数?是。第一个参数指向第一个参数。