Haskell数据声明中的类型约束

Haskell数据声明中的类型约束,haskell,types,typeclass,Haskell,Types,Typeclass,我正在使用Haskell并尝试编写以下内容: data Scale s = Scale s s 但是,我想使s必须是Num类型的类,比如Int或Double。使用Haskell和GHC可以做到这一点吗?是: {-# LANGUAGE GADTs #-} data Scale s where Scale :: Num s => s -> s -> Scale s 然而,一般认为最好的做法是不这样做。相反,只对使用Scales且需要Num约束的函数设置Num约束。放松这

我正在使用Haskell并尝试编写以下内容:

data Scale s = Scale s s
但是,我想使
s
必须是Num类型的类,比如Int或Double。使用Haskell和GHC可以做到这一点吗?

是:

{-# LANGUAGE GADTs #-}
data Scale s where
    Scale :: Num s => s -> s -> Scale s

然而,一般认为最好的做法是不这样做。相反,只对使用
Scale
s且需要
Num
约束的函数设置
Num
约束。放松这些约束可以让你在适当的时候暂时打破不变量;e、 g.对于这样的类型,通常希望有一个
函子
实例,如果您像上面那样约束构造函数,这是不可能的。

我对
类型也有类似的情况。但我并没有考虑约束,我考虑了如何对我的观点的元素类型进行泛化。然后我明白了,如果我有这样的点类型,数据点a=a点,那么我就可以做它,作为一个函子的实例,应用性的,可折叠的,可遍历的。我可以用标准的一般方法设计功能。例如:

dist :: Floating a => Point a -> Point a -> a
dist a b = sqrt $ sum $ (^2) <$> ((-) <$> a <*> b)
dist::浮点a=>a点->a点->a点
地区a b=sqrt$sum$(^2)(((-)a b)
我有个问题。发生了什么事?:)如果我添加约束(如您所要求的),我将无法用这种方式进行设计,并且我需要实现许多函数,如
pointSub


因此,有一些事情需要考虑:)

这是可能的,但几乎不是你应该做的。通常,最好只在实际需要的函数上设置
Num s
约束。Alec,我所有使用scale的函数都需要Num约束。@AviCaspe有很好的理由不这样做。答案有一个,但还有其他答案。你真的应该考虑把约束放在需要的地方。事实上,你甚至可以做一个选择。是的,我知道,你是对的。但我觉得这个例子并不有趣:)