繁体   English   中英

F#-将函数视为地图

[英]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,然后检查函数,但这就是这不是我感兴趣的-我感兴趣的是具有针对给定功能“修改”给定值的单个结果的功能。

潜在问题:

  1. 如果两次重写相同的值,则set -modified函数会泄漏空间:

     let huge_object = ... let small_object = ... let f0 = set f 0 huge_object let f1 = set f0 0 small_object 

    即使它永远不能输出f1huge_object不能被垃圾收集,直到f1可以: huge_object被引用的f0 ,这又被引用的f1

  2. set修饰的功能有架空线状中的数目set施加到其上的操作。

我不知道这些是否是您预期应用程序的实际问题。

如果您希望set为完全具有类型('k -> 'v) -> 'k -> 'v -> 'k -> 'v那么我看不到更好的方法(*)。 一个明显的想法是拥有一个已经修改过的函数的“修改表”,然后让set在该表中查找给定的f 但是函数类型不允许进行相等性检查,因此您无法将f与修改表中已知的函数集进行比较。

(*)不能忍受反思。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM