在值构造函数中指定类约束

Nic*_*lev 10 constructor haskell functional-programming

有没有办法为值构造函数的参数定义类约束?

像这样的东西:

data Point2D = (Num a) => Point a a
Run Code Online (Sandbox Code Playgroud)

只要它们属于Num类,Point就可以接受任何参数?

Car*_*arl 11

你可以使用ExistentialQuantificationGADTs,但两者都不会做你想要的.你将永远无法用两个Point2D值进行算术运算.你所知道的内容就是他们是Num的一些例子.您告诉编译器丢弃有关它们的所有其他信息.这意味着您告诉编译器丢弃它可能具有的特定Point2D值包含相同类型的任何信息.如果没有这些信息,您将无法对两个值的值进行任何算术运算Point2D.

这几乎肯定不是你想要的.例如,你不能写一个distance函数.对于如此有限的类型,您可以使用什么?关于你可以用它们做的所有事情是将它们的内容转换为String.

编辑:

我想我明白你在做什么.您只想确保Point2D中的所有内容都是数字.我不认为你真的想要类型擦除.

在这种情况下,我会选择GADT版本,其中一个非常重要的变化:

{-# LANGUAGE GADTs #-}
data Point2D a where
    Point :: (Num a) => a -> a -> Point2D a
Run Code Online (Sandbox Code Playgroud)

最终结果是你只能使用Point具有相同Num实例的两个值的构造函数,但是你不会丢失类型.此外,由于使用GADTs,Point构造函数上的模式匹配为您恢复了Num上下文,这基本上是您所期望的.

但我认为这里最重要的不是丢掉内容的类型.这样做使得这种类型基本上无法使用.