莫斯科ML/SML幻方代码报错:int*int与int*int*int类型冲突
解决SML/Moscow ML幻方代码中的类型冲突错误
你的问题出在函数参数结构不匹配:
place_number定义的第一个参数是三元组(i, j, num)- 递归调用时,
next_position(i,j)返回二元组(new_i, new_j),你直接将其单独作为第一个参数传入,再跟num、m分开传递,导致函数收到的是「二元组 + int + 数组」,和定义的「三元组 + 数组」类型完全不匹配。
修正方法很简单:把next_position返回的新坐标和num打包成三元组,再传给place_number。推荐用let绑定让代码更清晰:
fun place_number (i, j, num) m = if Array.sub(Array.sub(m, i), j) = 0 then (Array.update(Array.sub(m, i), j, num); m) else let val (new_i, new_j) = next_position (i, j) in place_number (new_i, new_j, num) m end
如果想更紧凑,也可以直接拼接三元组(但会重复调用next_position,不推荐):
fun place_number (i, j, num) m = if Array.sub(Array.sub(m, i), j) = 0 then (Array.update(Array.sub(m, i), j, num); m) else place_number (#1 (next_position (i,j)), #2 (next_position (i,j)), num) m
你之前尝试的几种写法,核心问题都是没把新坐标和num组合成函数要求的三元组,所以不管怎么调整m的括号,都无法解决类型冲突。
内容的提问来源于stack exchange,提问作者spacecowboy
相关产品推荐
相关产品推荐

