2016-02-27 6 views
2

Я написал функцию, которая делает возведение в степень с основанием, б и экспоненты е следующим образом:SML экспоненцирование реального с целыми

fun power b e = if e = 0 then 1 else b * power b (e-1); 

очевидно, что это работает на целых, как показано на выходе:

val power = fn : int -> int -> int 

Однако, я хочу, чтобы он принял реальное значение для b и целое число для e. Я попытался использовать следующее:

fun power (b : real) (e : int) = if e = 0 then 1 else b * power b (e-1); 

Это дает мне ошибки. Любая помощь приветствуется.

+1

, кстати, если вы действительно реализующие это, вы можете использовать [возведение в степень возведением в квадрат] (http://en.wikipedia.org/wiki/Exponentiation_by_squaring) , вместо линейного умножения 'b'' e' раз – newacct

ответ

4

Понял для кого-либо еще с той же проблемой в будущем:

Вы должны заставить функцию возвращать реальное и возвращает реальное для случая затем.

fun power b e : real = if e = 0 then 1.0 else b * power b (e-1); 

возвращается:

val power = fn : real -> int -> real 
+0

'fun power be = if e = 0, тогда 1.0 else b * power b (e-1);' также работает. Реальный литерал '1.0' достаточно намека на вывод типа SML. Учитывая, что ': real' является излишним (хотя и безвредным). –

+0

@JohnColeman Спасибо за разъяснение Джон. –