[英]F# - Treating a function like a map
长话短说,我想出了这个有趣的函数集 ,它使用一个函数f:'k->'v ,一个选定的值k:'k ,一个选定的结果v:'v ,使用f作为基础对于新函数g:'k->'v ,它与f完全相同,只是现在保留了gk = v 。
这是我编写的(非常简单的)F#代码:
let set : ('k -> 'v) -> 'k -> 'v -> 'k -> 'v =
fun f k v x ->
if x = k then v else f x
我的问题是:
这个功能有什么问题吗?
我可以想象像这样重复使用该功能
let kvs : (int * int) List = ... // A very long list of random int pairs.
List.fold (fun f (k,v) -> set f k v) id kvs
将开始在堆上建立一长串函数。 这件事值得关注吗?
在保持类型不变的同时,还有更好的方法吗?
我的意思是,我可以做一些事情,例如构造一个类型来保存原始函数f ,Map,将键值对设置为map,然后在使用键获取值时首先检查map,然后检查函数,但这就是这不是我感兴趣的-我感兴趣的是具有针对给定功能“修改”给定值的单个结果的功能。
潜在问题:
如果两次重写相同的值,则set
-modified函数会泄漏空间:
let huge_object = ... let small_object = ... let f0 = set f 0 huge_object let f1 = set f0 0 small_object
即使它永远不能输出f1
, huge_object
不能被垃圾收集,直到f1
可以: huge_object
被引用的f0
,这又被引用的f1
。
该set
修饰的功能有架空线状中的数目set
施加到其上的操作。
我不知道这些是否是您预期应用程序的实际问题。
如果您希望set
为完全具有类型('k -> 'v) -> 'k -> 'v -> 'k -> 'v
那么我看不到更好的方法(*)。 一个明显的想法是拥有一个已经修改过的函数的“修改表”,然后让set
在该表中查找给定的f
。 但是函数类型不允许进行相等性检查,因此您无法将f
与修改表中已知的函数集进行比较。
(*)不能忍受反思。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.