如何定義函數式語言中的複合函數,特別是Ocaml?例如,如果我編寫計算另一個函數結果的否定的函數,即:not(f(x))
其中f(x)
返回布爾值。我怎樣才能定義它?ocaml中的複合函數
8
A
回答
12
鑑於一些功能f
,具有類型:
f: 'a -> bool
要能產生另一個函數來包裝它否定結果
。讓我們看看這個新功能的類型,讓我們把它negated
(我不使用not
,因爲它是一個內置的名稱):
negated: ('a -> bool) -> 'a -> bool
爲什麼是這樣的類型?爲什麼不是'a -> bool
?請記住,我們希望這個新函數接受一個現有的函數,並返回一個具有相同類型的新函數,它會做一些不同的事情。爲了更清楚地看到它,你可以這樣想:('a -> bool) -> ('a -> bool)
這相當於。
所以現在給了這些限制,我們該怎麼寫negated
函數呢?
let negated f = ??
嗯,我們首先要考慮的是這個函數需要返回一個函數:
let negated f = (fun x -> ??)
下一步是什麼?那麼,我們知道我們創建的新函數應該用參數調用我們的包裝函數,否定它。讓我們這樣做,用參數調用函數:f x
,否定它:not (f x)
。這給了我們最終的功能定義:
let negated f = (fun x -> not (f x))
讓我們來看看它在行動:
# let f x = x < 5;;
val f : int -> bool = <fun>
# f 2;;
- : bool = true
# f 8;;
- : bool = false
# let negated f = (fun x -> not (f x));;
val negated : ('a -> bool) -> 'a -> bool = <fun>
# let g = negated(f);;
val g : int -> bool = <fun>
# g 2;;
- : bool = false
# g 8;;
- : bool = true
5
我不知道你要找究竟有多遠去這裏 - 你寫的代碼將工作精細。所以我會簡單介紹一下你如何從頭開始編寫這些東西。簡單的否定就是:
let not = function
| true -> false
| false -> true
如何編寫not (f x)
,它會給你的f x
結果的否定。
對於構成函數的函數,你可以使用:
let comp f g x = f (g x)
然後我們可以這樣做:
let even n = match n mod 2 with
| 0 -> true
| _ -> false
let odd = comp not even
3
哇,所有這些過於複雜的答案是什麼?出了什麼問題:
let compose f g x = g (f x)
爲了讓您的g(x) = not(f(x))
,假設你有一個f : 'a -> bool
:
let g = compose not f
此外,你可以做很酷的東西,如:
let composite_function =
let id x = x in
let transforms = [
(fun n -> n + 1);
(fun n -> n * 2);
(fun n -> n * n)
] in
List.fold_left compose id transforms
現在composite_function
具有類型int -> int
,其有效定義爲:
let composite_function n =
let n2 = (n + 1) * 2 in
n2 * n2
編輯:哦,我想查克其實是這麼做的。我可能不應該只是剔除。在任何情況下,我都喜歡摺疊撰寫功能,所以我會保持這種狀態。 :p
相關問題
- 1. 函子Map.make中的合併OCaml語義?
- 2. OCaml:樹函數
- 3. C++中的複合函數
- 4. 的函數參數,ocaml的
- 5. 如何在ocaml中混合多態函數和函子?
- 6. 在OCaml中重複字符串的遞歸函數
- 7. OCaml的動態函數名
- 8. OCaml:列表函數中的錯誤
- 9. 忽略OCaml中的函數優雅
- 10. 函數中綁定的值OCaml
- 11. Ocaml中函數的命名約定
- 12. 函數在OCaml中的單獨文件?
- 13. OCaml中List.iter和List.map函數的區別
- 14. OCaml中的匿名遞歸函數
- 15. 與OCaml中的函數匹配?
- 16. 複合的UniqueConstraint與函數
- 17. Rcpp中的複合伽瑪函數
- 18. C++中的複合興趣函數
- 19. 在haskell中替換複合函數中的函數
- 20. OCaml構造函數解包
- 21. Ocaml,瞭解一個函數
- 22. 函子與多個參數OCaml中
- 23. 在OCaml中使用長度函數
- 24. Haskell複雜函數組合
- 25. 複合損失函數
- 26. 複合Lambda函數 - Python
- 27. 函數集合中的函數聚合
- 28. 如何使用ocaml中的Y組合函數調用具有多個參數的函數?
- 29. 在另一個函數中調用多個函數Ocaml
- 30. 包裝返回記錄的OCaml函數
我們可以將`comp`定義爲運算符,例如:let($)f g = function x - > f(g x)let odd = not $ even` – ygrek 2011-02-15 08:39:02