SMLNJ - 函数独立工作,但不在另一个函数中

SMLNJ - Function works by itself, but not within another function

我有这个功能:

addBinaryTreeNode((genRandomNumber(100), genRandomNumber(100), genRandomNumber(100)), tree, 1, [])

那 return 是一种数据类型 "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 的 return 类型是 binaryTree,所以我不知道可能是什么问题。

问题是您的 genRandomNumber 没有 return int。相反,它 return 是一个 Random.rand -> int 类型的函数,其中 Random.rand 是随机数生成器的类型。您可以更改 genRandomNumber 的定义,以便它 在生成器上评估 这个函数并且 return 是一个整数。

根据 Random structure 的文档,函数 Random.rand(i,j) 创建了这样一个生成器。在生产代码中,您可能想找到一种方法从系统时钟中播种它(这在 SML 中似乎并不容易),但出于测试目的,您可以在特定的 i 和 [= 中 hard-wire 18=]:

val generator = Random.rand(1,5)
fun genRandomNumber(numToGen) = Random.randRange(1, numToGen) generator;

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