【问题标题】:SMLNJ - Function works by itself, but not within another functionSMLNJ - 函数单独工作,但不在另一个函数内
【发布时间】:2017-02-17 10:59:51
【问题描述】:

我有这个功能:

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

【问题讨论】:

  • 错误消息似乎很明确:addBinaryTreeNode 期望 3 个整数,但您传递给它的三个函数类型为 Random.rand -> int。因此genRandomNumber 100 不是你想象的那样。如果您显示genRandomNumber 的代码会有所帮助。
  • 呵呵,以为它显式地返回了一个 int。代码为:Random.randRange(1, numToGen)。我尝试将其声明为变量,但这似乎仍然不起作用。

标签: sml smlnj


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多