gpt4 book ai didi

map - F# - 像对待 map 一样对待函数

转载 作者:行者123 更新时间:2023-12-04 19:06:44 24 4
gpt4 key购买 nike

长话短说,我想出了这个有趣的功能 , 接受一个函数, f : 'k -> 'v ,选定的值, k : 'k ,选定的结果, v : 'v , 使用 f 作为新函数 的基础g : 'k -> 'v 这与 完全相同f ,除了现在认为, g k = 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_objectf0 引用, 依次由 f1 引用.
  • set - 修改函数的开销与 set 的数量成线性关系应用于它的操作。

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

    如果您愿意 set准确的类型 ('k -> 'v) -> 'k -> 'v -> 'k -> 'v那么我看不到更好的方法(*)。显而易见的想法是拥有一个你已经修改过的函数的“修改表”,然后让 set查找给定的 f在这张表中。但是函数类型不允许进行相等检查,因此您无法比较 f到您的修改表已知的一组函数。

    (*) 不能承受反射。

    关于map - F# - 像对待 map 一样对待函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22686593/

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