2017-02-16 24 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 ints, но вы передаете ему три функции типа 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), хотя для целей тестирования вы можете просто жестко провода в определенном i и j:

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

Используя эти определения, genRandomNumber теперь является функцией типа int -> int, поэтому, используя это определение, вы не будете иметь ошибку несоответствия такого же типа.

+0

Удивительно, спасибо за вашу помощь! Очень признателен. – EpicBlargh

 Смежные вопросы

  • Нет связанных вопросов^_^