Haskell AST中非结合性函数解析结果咨询
问题解答:非结合性函数调用的AST结构
正确的解析结果是(Func (Func (Var "f") [Var "x"]) [Var "y"]),具体解释如下:
先拆解
(f(x))(y)的语义逻辑:
这个表达式的执行顺序是先调用f(x)得到一个函数值,再将这个函数值作为新的函数,传入y进行调用。对应到给定的AST定义:f(x)本身是一个函数调用,对应AST节点:Func (Var "f") [Var "x"](表示以变量f为函数,参数为x的调用)。- 把这个调用结果当作函数,传入
y调用,就需要将上述节点作为外层Func的第一个参数,参数列表设为[Var "y"],最终形成Func (Func (Var "f") [Var "x"]) [Var "y"]。
为什么另一个选项不符合要求?
(Func (Var "f") [Func (Var "x") [Var "y"]])对应的语义是f(x(y))——也就是f的参数是x调用y的结果,和题目要求的(f(x))(y)完全不是同一个逻辑,显然不符合需求。再明确“非结合性”的含义:
这里的非结合性是指函数调用操作没有默认的结合规则,解析器不能自动推导省略括号后的表达式结构。比如加法这类结合性操作,a+b+c可以默认左结合成(a+b)+c,但你的场景中不允许这种默认推导,必须通过括号明确指定运算顺序——所以f(x)(y)是非法的,必须写成(f(x))(y)来明确“先执行f(x),再用结果调用y”的顺序,解析器据此生成对应的AST。
内容的提问来源于stack exchange,提问作者Piskator
相关产品推荐
相关产品推荐

