gpt4 book ai didi

haskell - 为什么值构造函数不能在不参数化类型的情况下获取类型变量?

转载 作者:行者123 更新时间:2023-12-02 13:16:58 24 4
gpt4 key购买 nike

作为初学者,我不清楚为什么不允许这样做:

data Pair = Pair a b

也就是说,为什么Pair 5 "foo"Pair 'C' [] 必须产生不同的类型?为什么不允许它们都创建 Pair 类型的值?

我正在从“Learn you a”、RWH 和 Haskell WikiBook 中学习,但一直无法找到我正在寻找的那种描述参数化类型的精确且不稳定的语言。

最佳答案

从根本上来说,问题是您不知道 Pair 的内容。 。如果您只知道它包含任何类型的值,那么您可以在其上使用的唯一真正函数将是 id ,这没什么用!

问题是,由于每个值都可能是任何,因此您根本无法保证它们。所以你甚至不能使用== :如果该值是一个函数怎么办?您无法比较函数是否相等!

想象一下编写一个作用于您的假设的函数 Pair类型:

fn (Pair a b) = ...

您还可以在 a 上使用哪些其他功能和b

任何具有任何具体类型的东西(例如 Int -> Int 或其他东西)都不起作用,因为你无法判断是否 aInt 。更复杂的类型如Num n => n -> n不起作用,因为你甚至不知道 a 是否有效是一个数字。唯一可以工作的函数是类型如 t1 -> t1 的函数。或t1 -> t2 。然而,第一种类型唯一合理的函数是 id并且根本不存在第二种类型的合理功能。

现在,您可以只说“我要尝试这个函数,如果该类型不起作用,则抛出错误。”但这将是动态类型,并且基本上会完全抛弃类型系统。这听起来很可怕,但有时可能有意义,因此您可以使用 Data.Dynamic完成类似的事情。然而,作为一个初学者,你不应该担心它,而且你很可能永远不需要使用它——到目前为止我还没有。我只是为了完整起见才将其包括在内。

关于haskell - 为什么值构造函数不能在不参数化类型的情况下获取类型变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10745896/

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