作为初学者,我不明白为什么不允许这样做:
data Pair = Pair a b
Run Code Online (Sandbox Code Playgroud)
也就是说,为什么Pair 5 "foo"并Pair 'C' []具备生产不同类型的?为什么它们都不允许创建类型的值Pair?
我正在学习"Learn you a",RWH和Haskell WikiBook,但是还没有找到那种精确,不稳定的语言来描述我正在寻找的参数化类型.
Tik*_*vis 10
从根本上说,问题是你没有关于内容的信息Pair.如果您只知道它包含任何类型的值,那么您可以使用的唯一真正的函数就是id,这是非常无用的!
问题在于,由于每个值都可以是任何值,因此根本无法保证它们.所以你甚至无法使用==:如果值是函数怎么办?你无法比较函数的相等性!
想象一下,根据您的假设Pair类型编写一个函数:
fn (Pair a b) = ...
Run Code Online (Sandbox Code Playgroud)
你可以使用其他什么功能上a和b?
任何具有任何具体类型(例如Int -> Int或某事)的东西都不会起作用,因为你无法判断它是否a是一个Int.更复杂的类型Num n => n -> n不起作用,因为你甚至不知道是否a是一个数字.那唯一的功能会工作是那些与类型,如t1 -> t1或t1 -> t2.然而,第一种类型的唯一合理的功能是id并且根本没有第二种类型的合理功能.
现在,您可以说"我将尝试此函数,如果类型不起作用,则抛出错误." 但这将是动态类型,并且基本上会完全抛弃类型系统.这听起来很糟糕,但有时可能会有意义,所以你可以用它Data.Dynamic来完成类似的事情.但是,你不应该担心它作为一个初学者而且你永远不需要使用它 - 我到目前为止还没有.我只是为了完整而包含它.