4

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

data Pair = Pair a b

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

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

4

2 回答 2

10

从根本上说,问题在于您将没有关于Pair. 如果您只知道它包含任何类型的值,那么您可以在其上使用的唯一真正的函数就是id,这是非常没用的!

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

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

fn (Pair a b) = ...

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

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

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

于 2012-05-24T22:03:52.860 回答
4

使用存在类型语言扩展,您可以定义这样的类型:

{-# LANGUAGE ExistentialQuantification #-}

data Pair = forall a b. Pair a b

a, b :: Pair                                
a = Pair 1 2
b = Pair "abc" 'x'

这里两者都a具有b相同的类型。

通常这不是这样做的,因为要对 a 做任何有用的事情,Pair您需要知道它包含什么,并且定义Pair删除了所有这些信息。

因此,如果您真的需要,您可以创建这样的值,但是很难找到任何有用的东西来处理它们。

于 2012-05-24T22:28:06.037 回答