Map F#-将函数视为映射
长话短说,我提出了一个有趣的函数集,它采用了一个函数,一个选择值,一个选择结果,一个选择结果,使用f作为一个新函数的基础,这个函数与f完全相同,除此之外,它现在认为,gk=v 以下是我编写的(非常简单的)F#代码:Map F#-将函数视为映射,map,f#,functional-programming,Map,F#,Functional Programming,长话短说,我提出了一个有趣的函数集,它采用了一个函数,一个选择值,一个选择结果,一个选择结果,使用f作为一个新函数的基础,这个函数与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 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,一个映射,设置映射的键值对,然后在使用键获取值时先检查映射,然后检查函数,但这不是我感兴趣的-我感兴趣的是有一个“修改”的函数给定值、给定函数的单个结果。潜在问题:
let huge_object = ...
let small_object = ...
let f0 = set f 0 huge_object
let f1 = set f0 0 small_object
即使它永远不可能是f1
的输出,ground\u object
也不能被垃圾收集,直到f1
can:ground\u object
被f0
引用,而f1
又引用了
set
-modified函数在应用于它的set
操作的数量上具有线性开销set
的类型正好是('k->'v)->'k->'v->'k->'v
,那么我看不到更好的方法(*)。一个显而易见的想法是,为您已经修改过的函数建立一个“修改表”,然后让set
在此表中查找给定的f
。但是函数类型不允许相等检查,因此无法将f
与修改表已知的函数集进行比较
(*)反射无法抵抗。你提到反射。你能不能再谈一谈如何使用它?另外,如果类型“k”是一个简单的有区别的并集呢?它没有区别
'k
是一些已知的类型t
。然后你会考虑函数<代码>(t->v),但是没有函数类型是相等的,所以也不是这个函数。(这是计算机科学中一个著名的结果,通常不可能确定两个函数是否相等,也就是说,为相同的输入产生相同的输出。)Wrt。反射,我想您可以使用反射来获得函数'k->'v
的运行时表示的引用。你可以比较一下是否相等,然后放在地图上。好的。谢谢你的回答。这是非常有益的。:)