2017-02-16 38 views
0

內我有這樣的功能:SMLNJ - 功能的工作原理本身,而不是其他功能

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的返回類型是二叉樹,所以我不知道這個問題可能是什麼。

+0

錯誤消息看起來很明顯:'addBinaryTreeNode'需要3個整數,但是你傳遞了三個類型爲'Random.rand - > int'的函數。因此'genRandomNumber 100'不是你想象的那樣。如果你顯示'genRandomNumber'的代碼會有幫助。 –

+0

呵呵,以爲它明確地返回了一個int。代碼是:'Random.randRange(1,numToGen)'。我試圖將它聲明爲一個變量,但似乎仍然沒有工作。 – EpicBlargh

回答

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類型的函數,因此使用此定義將不會有相同類型的不匹配錯誤。

+0

太棒了,謝謝你的幫助!非常感激。 – EpicBlargh