gpt4 book ai didi

haskell - 为什么 DuplicateRecordFields 不能进行类型推断?

转载 作者:行者123 更新时间:2023-12-04 11:20:41 24 4
gpt4 key购买 nike

相关帖子:How to disambiguate selector function?

https://ghc.haskell.org/trac/ghc/wiki/Records/OverloadedRecordFields/DuplicateRecordFields

However, we do not infer the type of the argument to determine the datatype, or have any way of deferring the choice to the constraint solver.



没有实现此功能实际上很烦人。我试图查找多个来源,但找不到他们决定不推断类型的原因。

有人知道这样做的充分理由吗?是因为当前类型系统的限制吗?

最佳答案

您将对 OverloadedRecordFields 感兴趣这仍在实现。

当前的实现被故意削弱,以免一次引入太多新东西。推断记录投影类型结果会打开一个讨厌的蠕虫 jar (前面提到的扩展地址)。

考虑以下 GHCi 交互

ghci> data Record1 = Record1 { field :: Int }
ghci> data Record2 = Record2 { field :: Bool }
ghci> :t field
field的类型应该是什么现在?不知何故,我们需要一种方法来捕捉“任何具有名为 field 的字段的记录”的概念。为此, OverloadedRecordFields引入了一个新的内置类型类

The new module GHC.Records defines the following:

class HasField (x :: k) r a | x r -> a where
getField :: r -> a

A HasField x r a constraint represents the fact that x is a field of type a belonging to a record type r. The getField method gives the record selector function.



然后,从我们上面的示例中,就好像以下实例是由 GHC 神奇地生成的(实际上这并不是真正会发生的事情,但它是一个很好的初步近似)。
instance HasField "field" Record1 Int where
getField (Record1 f) = f

instance HasField "field" Record2 Bool where
getField (Record2 f) = f

如果您有兴趣,我建议您阅读该提案。我没有提到的另一个功能是 IsLabel。类(class)。一旦所有这些都实现(以及更多用于更新记录),我期待能够 get my lenses for free (所以我可以停止声明以下划线开头的字段名称并为 TemplateHaskell 启用 makeLenses )。

关于haskell - 为什么 DuplicateRecordFields 不能进行类型推断?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41008295/

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