2017-02-16 7 views
0

以内に私はこの機能を持っている: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であることを知っているので、私は問題は何ができるかわかりません。

+0

エラーメッセージはかなり明白です: 'addBinaryTreeNode'は3つの整数を期待していますが、' Random.rand - > int'型の3つの関数を渡しています。したがって、 'genRandomNumber 100'はそれがあなたが思うものではありません。 'genRandomNumber'のコードを表示すると助けになります。 –

+0

ああ、明示的にintを返したと思った。コードは 'Random.randRange(1、numToGen)'です。変数に宣言しようとしましたが、まだ動作していないようです。 – EpicBlargh

答えて

1

genRandomNumberintを返さないという問題があります。代わりに、タイプ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

関連する問題