递归地将列表解压缩为元素
Recursively unpack list into elements
我有一个列表,想 return 从中单独提取每个元素。基本上就像从堆栈中弹出。例如:
let rnd = new System.Random()
let rnds = List.init 10 (fun _ -> rnd.Next(100))
List.iter (fun x -> printfn "%A"x ) rnds
然而,我不想迭代,而是想 return 每个整数一个接一个,直到列表为空。所以基本上是这样的:
List.head(rnds)
List.head(List.tail(rnds))
List.head(List.tail(List.tail(rnds)))
List.head(List.tail(List.tail(List.tail(List.tail(rnds)))))
不幸的是,我尝试使用折叠或扫描的递归解决方案或什至更好的解决方案都没有成功。例如,这只是 returns 列表(与地图相同)。
let pop3 (rnds:int list) =
let rec pop3' rnds acc =
match rnds with
| head :: tail -> List.tail(tail)
| [] -> acc
pop3' [] rnds
这似乎是 class
的好机会
type unpacker(l) =
let mutable li = l
member x.get() =
match li with
|h::t -> li<-t;h
|_ -> failwith "nothing left to return"
uncons
会做您需要的吗?
let uncons = function h::t -> Some (h, t) | [] -> None
您可以将它用于 'pop' 列表的头部:
> rnds |> uncons;;
val it : (int * int list) option =
Some (66, [17; 93; 33; 17; 21; 1; 49; 5; 96])
你可以重复这个:
> rnds |> uncons |> Option.bind (snd >> uncons);;
val it : (int * int list) option = Some (17, [93; 33; 17; 21; 1; 49; 5; 96])
> rnds |> uncons |> Option.bind (snd >> uncons) |> Option.bind (snd >> uncons);;
val it : (int * int list) option = Some (93, [33; 17; 21; 1; 49; 5; 96])
我有一个列表,想 return 从中单独提取每个元素。基本上就像从堆栈中弹出。例如:
let rnd = new System.Random()
let rnds = List.init 10 (fun _ -> rnd.Next(100))
List.iter (fun x -> printfn "%A"x ) rnds
然而,我不想迭代,而是想 return 每个整数一个接一个,直到列表为空。所以基本上是这样的:
List.head(rnds)
List.head(List.tail(rnds))
List.head(List.tail(List.tail(rnds)))
List.head(List.tail(List.tail(List.tail(List.tail(rnds)))))
不幸的是,我尝试使用折叠或扫描的递归解决方案或什至更好的解决方案都没有成功。例如,这只是 returns 列表(与地图相同)。
let pop3 (rnds:int list) =
let rec pop3' rnds acc =
match rnds with
| head :: tail -> List.tail(tail)
| [] -> acc
pop3' [] rnds
这似乎是 class
的好机会type unpacker(l) =
let mutable li = l
member x.get() =
match li with
|h::t -> li<-t;h
|_ -> failwith "nothing left to return"
uncons
会做您需要的吗?
let uncons = function h::t -> Some (h, t) | [] -> None
您可以将它用于 'pop' 列表的头部:
> rnds |> uncons;;
val it : (int * int list) option =
Some (66, [17; 93; 33; 17; 21; 1; 49; 5; 96])
你可以重复这个:
> rnds |> uncons |> Option.bind (snd >> uncons);;
val it : (int * int list) option = Some (17, [93; 33; 17; 21; 1; 49; 5; 96])
> rnds |> uncons |> Option.bind (snd >> uncons) |> Option.bind (snd >> uncons);;
val it : (int * int list) option = Some (93, [33; 17; 21; 1; 49; 5; 96])