Map 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 我的问题是: 此功能是否存在任何问题? 我可以

长话短说,我提出了一个有趣的函数集,它采用了一个函数,一个选择值,一个选择结果,一个选择结果,使用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 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
    的运行时表示的引用。你可以比较一下是否相等,然后放在地图上。好的。谢谢你的回答。这是非常有益的。:)