Haskell 是否有可能在编译时分析类映射结构何时可以在适当的位置发生变异?

Haskell 是否有可能在编译时分析类映射结构何时可以在适当的位置发生变异?,haskell,data-structures,compilation,functional-programming,Haskell,Data Structures,Compilation,Functional Programming,为了简单起见,假设我们用一个原语来扩展lambda演算,该原语用于带有字符串键的映射。我们添加了两个操作:set map key val和get map key。为了实际实现这个原语,我们可以使用一个持久的数据结构a la Haskell的data.Map,它将为我们提供O(log(n))集合和获取 假设我们用哈希表实现了这个结构get将是O(1),set将是O(N),因为它需要克隆整个哈希表在编译类型期间,是否可以分析所有可以安全执行就地变异的位置,用隐藏的mset操作替换set?可能,可能是

为了简单起见,假设我们用一个原语来扩展lambda演算,该原语用于带有字符串键的映射。我们添加了两个操作:
set map key val
get map key
。为了实际实现这个原语,我们可以使用一个持久的数据结构a la Haskell的
data.Map
,它将为我们提供
O(log(n))
集合和获取


假设我们用哈希表实现了这个结构
get
将是
O(1)
set
将是
O(N)
,因为它需要克隆整个哈希表在编译类型期间,是否可以分析所有可以安全执行就地变异的位置,用隐藏的
mset
操作替换
set

可能,可能是。但是编译器应该是保守的:只有当编译器能够证明它是安全的,它才能使用
mset
@WillemVanOnsem当然!我想知道这种情况下的一般场景是什么。例如,静态分析可以检测到数据结构是线性使用的(如在线性类型/线性逻辑中),并启用这种优化。但是,这需要一个完整的程序分析,或者至少我们需要能够看到每个地图可以使用的所有点。@chi我可以进行完整的程序分析,但有些情况让我感到困惑。例如,
(让map={};inc=\\更新(+1)0 map;foo=\f->(f(0),f(0))in(foo inc))
。此处,
map
仅出现一次。但是它在
inc
内部使用,然后发送到
foo
,然后使用两次。所以仅仅检查一个变量只使用一次是不够的,这个问题似乎需要一些更复杂的分析。我希望有一个资源更具体地研究/解释这个问题@MaiaVictor我不是线性类型专家,但我猜这不会进行类型检查
inc
依赖于
map
,因此
inc
获取线性类型
inc
传递给
foo
,因此
foo
必须采用线性参数。。。但是它使用了两次,触发类型错误。