[英]Counter Variable in Ocaml?
如果您不能在 Ocaml 中使用可變狀態,您將如何在遞歸函數中創建計數器變量。 例如:
假設您有一個數據類型 e,您希望以遞歸方式對(該數據類型的)表達式進行模式匹配。
Match expression (e: example) : int
|O(i) -> int x + 1
因此,在該示例中(故意省略其他情況),如果您發現 O(i),您希望 int x 從 0、+ 1 + 2 + 3 增加...
當我嘗試實現它時,它說一個“未綁定值 int”。 那么你將如何創建一個可以隨着每次迭代而改變的變量。
對不起,如果這沒有意義。
從命令式到函數式看待事物的一種方式是想象你想要改變的每個變量都是一個函數的參數。 當你想改變變量的值時,你調用傳遞新值的函數。
這聽起來可能很瘋狂(或者可能不是),但這實際上是 FP 中的工作方式。
下面是一些命令式代碼,用於計算數字 5 在整數列表中出現的次數:
let how_many_5s l =
let rest = ref l in
let count = ref 0 in
while !rest <> [] do
if List.hd !rest = 5 then
count := !count + 1;
rest := List.tl !rest
done;
!count
這是做同樣事情的功能代碼。 上面代碼中修改的變量,剩余的列表和計數器,都是內部函數的參數。
let how_many_5s_functional list =
let rec inner count list =
match list with
| [] -> count
| 5 :: t -> inner (count + 1) t
| _ :: t -> inner count t
in
inner 0 list
我不完全確定你在問什么,你在使用什么語法(它不是 OCaml),但既然你提到了“遞歸”和“計數器變量”,我將嘗試說明你如何增加使用此示例遞歸期間的計數器,它構造一個包含從a
到b
數字的列表:
let rec range a b =
if a > b then
[]
else
a :: range (a + 1) b
對於每次迭代, a
的值將增加 1 直到到達b
,並且通過將a
添加到通過遞增a
遞歸運行range
生成的列表的頭部來構建列表。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.