2017-01-24 84 views
1

我寫了一個函數,它可以計算一個由實數列表構成的多項式的x的值。創建一個返回curried函數(SML)的函數

infixr 5 ^^; 

fun (x:real) ^^ 0 = 1.0 
    | (x:real) ^^ n = x*(x^^(n-1)); 

fun poly [] (x:real) = 0.0 
    | poly (hd::tl) (x:real) = hd*(x^^(length tl)) + poly tl x; 

這段代碼所有的工作都很好,我爲此感到很自豪。

我已成功使用部分應用程序來創建多項式函數:

> fun f x = poly [3.0,2.0,1.0] x; 
val f = fn : real -> real 

> f 2.0; 
val it = 17.0 : real 

創建mathetmatical功能:f(x) = 3*x^2 + 2*x + 1

這一切都是好的,但我希望能夠通過這種方法來構建一個功能:

fun f x = polyGen [1.0,2.0,3.0]; 

它會給我一個等效的功能,上面的一個。 這可能嗎? 我知道這似乎很微不足道,我可以像以前那樣放一個x,繼續我的生活。但我只是很好奇如何有人會解決這個問題!

由於提前,夏蘭

編輯:

fun polyGen L = let fun poly [] x = 0.0 
         | poly (hd::tl) x = hd + x*(poly tl x); 
       in fn x => poly L x end; 

可愛!

回答

3

如果我正確理解你的問題,那麼你根本不需要定義其他任何東西。隨着功能poly,你有你已經可以做

val f = poly [3.0, 2.0, 1.0] 

f定義爲real -> real類型的函數。