我有这个功能:
addBinaryTreeNode((genRandomNumber(100), genRandomNumber(100), genRandomNumber(100)), tree, 1, [])
返回数据类型“binaryTree”。它会在单独编译时进行编译,但是当我在函数中进行编译时:
generate3DNodeTree(addBinaryTreeNode((genRandomNumber(100), genRandomNumber(100), genRandomNumber(100)), tree, 1, []), numToGen - 1)
...它不会编译,给我这些错误:
stdIn:215.21-215.135 Error: operator and operand don't agree [tycon mismatch]
operator domain: (int * int * int) * binaryTree * int * int list
operand: ((Random.rand -> int) * (Random.rand -> int) * (Random.rand -> int)) * binaryTree * [int ty] * 'Z list
in expression:addBinaryTreeNode((genRandomNumber 100,genRandomNumber 100,genRandomNumber 100),tree,1,nil)
函数“generate3DNodeTree”包含参数:
(tree : binaryTree, numToGen : int)
......这正是我传递给它的。为什么这不起作用?
generate3DNodeTree可以正常工作,如果我这样传递它:
generate3DNodeTree(tree, numToGen - 1)
SMLNJ知道addBinaryTreeNode的返回类型是binaryTree,所以我不知道问题是什么。
答案 0 :(得分:1)
问题是您的genRandomNumber
未返回int
。相反,它返回类型为Random.rand -> int
的函数,其中Random.rand
是随机数生成器的类型。您可以更改genRandomNumber
的定义,以便在生成器上评估此函数并返回一个int。
根据Random structure的文档,函数Random.rand(i,j)
创建了这样的生成器。在生产代码中,您可能希望找到一种从系统时钟中播种它的方法(在SML中看起来并不容易),但出于测试目的,您只需在特定的i
和{{1}中进行硬连接即可。 }:
j
使用这些定义,val generator = Random.rand(1,5)
fun genRandomNumber(numToGen) = Random.randRange(1, numToGen) generator;
现在是genRandomNumber
类型的函数,因此使用此定义时,您将不会出现相同的类型不匹配错误。