我必須撰寫一個sum
將值作為第一個引數的函式n
。第二個引數是一個函式f
,因此 sum 計算高斯和。
第二步,我必須實作sum_gauss (int->int)
usingsum
和 lambda 運算式。
這是我對該功能的想法sum
:
let rec sum (n:int) (f:int->int) : int =
if n < 1 then 0
else sum (n-1) f f n
這是sum_gauss
引發錯誤的原因:
let sum_gauss = sum ((i:int) -> fun (i:int) : int -> i)
錯誤是:
Line 1, characters 30-32:
Error: Syntax error: ')' expected
Line 1, characters 22-23:
This '(' might be unmatched
我不明白為什么會出現此錯誤,因為每個左括號都與右括號匹配。
uj5u.com熱心網友回復:
用型別推斷重寫清理:
let rec sum n f =
if n < 1 then 0
else sum (n-1) f f n
如果你想添加從 1 到n
. 您需要將數字和函式sum_gauss
作為單獨的引數傳遞給。
let sum_gauss n = sum n (fun x -> x)
當然,fun x -> x
真的只是Fun.id
。
let sum_gauss n = sum n Fun.id
如果您想變得特別聰明并且您已經在使用該Fun
模塊,您可以使用該模塊作為第二個引數Fun.flip
傳遞并完全從定義中洗掉。不是多型的事實避免了部分應用程式的弱型別問題。Fun.id
sum
n
sum
let gauss_sum = Fun.(flip sum id)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/537588.html
標籤:功能拉姆达和奥卡姆高斯
上一篇:在Python中呼叫計算函式