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
的函数,因此使用此定义不会出现相同类型不匹配错误。
我有这个功能:
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
的函数,因此使用此定义不会出现相同类型不匹配错误。