SMLNJ - 函数本身可以工作,但不能在另一个函数中工作

时间:2017-02-16 23:50:50

标签: sml smlnj

我有这个功能:

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,所以我不知道问题是什么。

1 个答案:

答案 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类型的函数,因此使用此定义时,您将不会出现相同的类型不匹配错误。