gpt4 book ai didi

f# - 在 F# 中,在有区别的联合中严格计算和内存

转载 作者:行者123 更新时间:2023-12-04 22:27:11 25 4
gpt4 key购买 nike

我有一个受歧视的工会,例如

type Dish = 
| Eggs
| Spam of Dish

这基本上是一个链表,没有任何内容,例如 Spam(Spam(Spam(Eggs))) .我想对这个结构进行严格的计算,比如计算长度,并记住结果。在普通类型中,我会使用类本地 let绑定(bind),但这些在有区别的联合中不可用。

一种方法是,
type Count = int
type Dish =
| Eggs
| Spam of Dish * Count

但这真的很困惑,当我需要的数据很容易计算时,但我仍然希望有更好的方法(不使用外部可变结构)。

最佳答案

一种选择是将联合案例设为私有(private)以隐藏缓存的长度。

//the 'guts' of Dish -- entirely hidden
type private DishImpl =
| Eggs
| Spam of DishImpl

// Dish wrapper type -- implementation hidden
type Dish =
private
| Dish of DishImpl * int
with
// O(1), just get the 'length' field
member x.Length = let (Dish(_, len)) = x in len
static member Eggs() = Dish(Eggs, 1)
static member Spam(Dish(dish, len)) = Dish(Spam dish, len + 1)

let eggs = Dish.Eggs()
let spam = Dish.Spam(eggs)
printfn "%d" eggs.Length //outputs: 1
printfn "%d" spam.Length //outputs: 2

要做到这一点,请使用 let 创建一个随附的模块解构的绑定(bind)函数和事件模式。

关于f# - 在 F# 中,在有区别的联合中严格计算和内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12821718/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com