使用#0和#1析构函数定义SML函数时出现语法错误求助
问题解答:修复元组析构函数实现函数的语法错误
首先看原始的模式匹配实现函数:
fun f (x,0) = x | f (0,y) = y | f (x,y) = x+y;
你用if-else改写的f1可以正常运行:
fun f1(x, y) = if y = 0 then x else if x = 0 then y else x + y;
但你尝试用元组析构函数实现的f2出现语法错误,错误根源是Standard ML的元组索引从1开始,不存在#0这个析构函数,这就是报错的核心原因。
错误的f2代码:
fun f2(arg) = if #0(arg) = 0 then #1(arg) else if #1(arg) = 0 then #0(arg) else #0(arg) + #1(arg);
对应的错误信息:
Error: syntax error: deleting INT0 LPAREN
修复后的正确f2代码,只需把#0替换为#1,#1替换为#2即可:
fun f2(arg) = if #1(arg) = 0 then #2(arg) else if #2(arg) = 0 then #1(arg) else #1(arg) + #2(arg);
如果想提升代码可读性,可以先把元组的两个元素绑定到变量,再进行判断:
fun f2(arg) = let val x = #1 arg val y = #2 arg in if y = 0 then x else if x = 0 then y else x + y end;
内容的提问来源于stack exchange,提问作者Danial
相关产品推荐
相关产品推荐

