gpt4 book ai didi

haskell - 奇怪的存在类型

转载 作者:行者123 更新时间:2023-12-04 22:14:11 26 4
gpt4 key购买 nike

http://www.iai.uni-bonn.de/~jv/mpc08.pdf - 在本文中,我无法理解以下声明:

instance TreeLike CTree where
...
abs :: CTree a -> Tree a
improve :: (forall m. TreeLike m => m a) -> Tree a
improve m = abs m
  • (forall m. TreeLike m => m a) 带来什么区别(我认为 TreeLike m => m a 在这里就足够了)
  • 为什么这里允许 abs,如果 m 中的 m 可以是任何 TreeLike,而不仅仅是 CTree?
  • 最佳答案

    那是 rank-2 类型,而不是存在类型。该类型意味着 improve 的参数必须是多态的。您不能将 Ctree a 类型的值(例如)传递给 improve 。它在类型构造函数中根本不可能是具体的。它在类型构造函数中明确必须是多态的,约束类型构造函数实现 Treelike 类。

    对于您的第二个问题,这允许 improve 的实现为 m 选择它想要的任何类型 - 这是实现的选择,并且类型系统对调用者隐藏它。在这种情况下,实现恰好为 Ctree 选择了 m。那完全没问题。诀窍是 improve 的调用者无法在任何地方使用该信息。

    这有一个实际结果,即不能使用类型的细节来构造值——它必须使用 Treelike 类中的函数来构造它。但是实现可以选择一个特定的类型来工作,允许它在内部使用表示的细节。

    关于haskell - 奇怪的存在类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14077344/

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