Haskell 单分子碱能代替单态限制吗

Haskell 单分子碱能代替单态限制吗,haskell,polymorphism,memoization,Haskell,Polymorphism,Memoization,单态限制存在的主要原因是为了避免意外的重复工作 一个示例是以下函数: len2 xs = (len, len) where len = genericLength xs 它的推断类型为(Num b,Num c)=>[a]->(b,c),不幸的是,这会导致出现uncurry(+)之类的情况。len2实际上计算了genericLength两次,尽管它实际上只需要计算一次 但是,即使没有MonomorphismRestriction,当您打开monocalbinds时,也可以正确推断出更安全

单态限制
存在的主要原因是为了避免意外的重复工作

一个示例是以下函数:

len2 xs = (len, len)
    where len = genericLength xs
它的推断类型为
(Num b,Num c)=>[a]->(b,c)
,不幸的是,这会导致出现
uncurry(+)之类的情况。len2实际上计算了
genericLength
两次,尽管它实际上只需要计算一次

但是,即使没有
MonomorphismRestriction
,当您打开
monocalbinds
时,也可以正确推断出更安全的类型
Num b=>[a]->(b,b)

鉴于
单焦点索引
是通过
GADTs
TypeFamilies
自动打开的,并且应该通过
重叠
自动打开(但目前没有)。从长远来看,似乎拥有
单核抗体
取代
单核抗体
会使人受益匪浅。特别是因为人们似乎普遍认为
TypeFamilies
GADTs
非常有用,最终可能成为标准

现在有些事情,比如:

foo = 8 ^ 8 ^ 8

bar = foo + foo
仍然存在重复的风险。但我认为,这样的表达式在实际代码中并不常见,不足以证明
单态限制的缺陷

此外,如果在上面的示例中导出了
foo
,那么我认为即使存在复制风险,也应该将类型设置为
Num a=>a
,如果没有导出,那么优化器似乎不难在
条中删除复制


另一方面,Haskell是否有可能在将来的某个时候实现特定类型的记忆化?因为这似乎对多态顶级计算非常方便。

这不正是您要寻找的“特定类型的记忆”吗?@Alec看起来是的,我希望有一种更通用的形式,不需要列举我想要记忆的所有不同类型。这也是一种普遍适用于本地和全局绑定的方法,不会出现明显的代码膨胀。另外,如果您想将
SPECIALIZE
的编写委托给调用站点(在不同的模块中),您只需声明目标函数
INLINEABLE
,并将
SPECIALIZE
pragmas放在另一个模块中。。。文档对此进行了详细说明。是否可以执行
{-#SPECIALIZEALL#-}
或类似的操作,其中GHC可以保证的每种类型(不一定使用,但只是类型匹配)都是专门化的?这不正是您正在寻找的“特定类型的备忘录”吗?@Alec看起来是这样的,我希望有一个更通用的表单,它不需要列举我想要记忆的所有不同类型。这也是一种普遍适用于本地和全局绑定的方法,不会出现明显的代码膨胀。另外,如果您想将
SPECIALIZE
的编写委托给调用站点(在不同的模块中),您只需声明目标函数
INLINEABLE
,并将
SPECIALIZE
pragmas放在另一个模块中。。。文档对此进行了详细说明。是否可以执行
{-#SPECIALIZEALL#-}
或类似的操作,其中GHC可以保证的每个类型都被请求(不一定使用,但只是类型匹配)被专门化?