【发布时间】:2021-08-18 11:05:28
【问题描述】:
我正在努力将非平凡函数映射为尾递归。
即使是简单的玫瑰树
type Tree<'a> =
| Leaf of 'a
| Branch of List<Tree<'a>>
有地图
let rec map : ('a -> 'b) -> Tree<'a> -> Tree<'b> =
fun f ->
function
| Leaf a ->
f a
|> Leaf
| Branch xs ->
xs
|> List.map (map f)
|> Branch
(更不用说绑定了)
使这个尾递归看起来很痛苦,我看过 FSharpx 之类的例子,但它们不是尾递归的。 我找到了这个
https://www.gresearch.co.uk/article/advanced-recursion-techniques-in-f/
但是从基于连续性的最后一个示例的飞跃似乎完全符合他们的示例(最大),我似乎无法理解它。
在某处有这个非常规范的示例的示例实现吗?
所以简单的部分应该是这样的
let map2 : ('a -> 'b) -> Tree<'a> -> Tree<'b> =
fun f ta ->
let rec innerMap : Tree<'a> -> (Tree<'b> -> Tree<'b>) -> Tree<'b> =
fun ta cont ->
match ta with
| Leaf a ->
f a |> Leaf |> cont
innerMap ta id
但我错过了分支的难点
【问题讨论】:
标签: f# tail-recursion