2017-02-24 174 views
1

下面是使用梯形方法計算定積分的SML代碼,給定輸入f =一元函數a & b =在積分下的範圍,以及n =除以子區間的數量進入的範圍。將函數傳遞給函數SML

fun integrate f a b n = 
let val w = (b - a)/(real n) 
fun genBlock c = let val BB = f c 
      val SB = f (c+w) 
     in (BB + SB) * w/2.0 
     end 
fun sumSlice 0 c acc = acc 
    | sumSlice n c acc = sumSlice (n-1) (c+w) (acc + (genBlock c)) 
in sumSlice n a 0.0 
end 

問題是我無法弄清楚了我的生活如何定義一個函數(比如X立方),並將其與A,B,和n養活這個功能。下面是我的嘗試,收到錯誤截圖: enter image description here

在這張圖片中,我定義立方體X = X X X,並顯示它的工作原理,然後嘗試將其提供給了整合功能無濟於事。

回答

4

的錯誤信息是非常具體:integrate期待real -> real類型的功能,但你定義的函數,cubeint -> int類型。

有幾件事情可以做:

1)添加類型註釋的cube定義:

- fun cube x:real = x*x*x; 
val cube = fn : real -> real 

然後:

- integrate cube 0.0 5.0 5; 
val it = 162.5 : real 

2)你可以免去定義cube作爲命名函數,只需將計算作爲匿名函數傳遞即可。在這種情況下,SML的類型推理機制給出了函數x => x*x*x的預期類型:

- integrate (fn x => x*x*x) 0.0 5.0 5; 
val it = 162.5 : real