SMLNJ-函数本身工作,但不在另一个函数内工作

SMLNJ-函数本身工作,但不在另一个函数内工作,sml,smlnj,Sml,Smlnj,我有这个功能: addBinaryTreeNode((genRandomNumber(100), genRandomNumber(100), genRandomNumber(100)), tree, 1, []) generate3DNodeTree(addBinaryTreeNode((genRandomNumber(100), genRandomNumber(100), genRandomNumber(100)), tree, 1, []), numToGen - 1) 返回数据类型bi

我有这个功能:

addBinaryTreeNode((genRandomNumber(100), genRandomNumber(100), genRandomNumber(100)), tree, 1, [])
generate3DNodeTree(addBinaryTreeNode((genRandomNumber(100), genRandomNumber(100), genRandomNumber(100)), tree, 1, []), numToGen - 1)
返回数据类型binaryTree的。当它自己编译时,它会编译,但当我在函数中有它时:

addBinaryTreeNode((genRandomNumber(100), genRandomNumber(100), genRandomNumber(100)), tree, 1, [])
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,所以我不知道问题出在哪里。

问题是genRandomNumber不返回int。相反,它返回一个Random.rand->int类型的函数,其中Random.rand是随机数生成器的类型。您可以更改genRandomNumber的定义,以便它在生成器处计算此函数并返回int

根据的文档,函数Random.randi,j创建了这样一个生成器。在生产代码中,您希望找到一种从系统时钟开始播种的方法,这在SML中似乎并不容易,但出于测试目的,您可以在特定的i和j中硬连线:


使用这些定义,genRandomNumber现在是int->int类型的函数,因此,使用此定义不会出现相同的类型不匹配错误。

错误消息似乎非常明确:addBinaryTreeNode预期为3个整数,但您将向其传递三个类型为Random.rand->int的函数。因此genRandomNumber 100不是您所认为的。如果你显示genRandomNumber的代码会有帮助。嗯,我想它会显式返回一个int。代码是:Random.randRange1,numToGen。我试图将它声明为一个变量,但似乎仍然不起作用。