在数据声明Haskell中键入约束

Avi*_*spe 7 haskell types typeclass

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

data Scale s = Scale s s
Run Code Online (Sandbox Code Playgroud)

但是,我想使它s必须是Num类型的东西,比如Int或Double.使用Haskell和GHC可以吗?

Dan*_*ner 19

是:

{-# LANGUAGE GADTs #-}
data Scale s where
    Scale :: Num s => s -> s -> Scale s
Run Code Online (Sandbox Code Playgroud)

但是,通常认为最好要这样做.相反,把Num约束只能在使用功能的ScaleS和需要Num约束.放松这些限制可以让你在适当的时候暂时打破不变量; 例如,希望Functor这种类型的实例是常见的,如果你像上面那样限制构造函数,这是不可能的.


fre*_*yle 7

我的类型情况类似Point.但我想不到约束,我想到了如何做我的观点的泛化元素类型.然后我明白如果我有这样的点类型data Point a = Point a a然后我可以做Functor,Applicative,Foldable和Traversable的实例.而且我可以通过标准的方式设计功能.例如:

dist :: Floating a => Point a -> Point a -> a
dist a b = sqrt $ sum $ (^2) <$> ((-) <$> a <*> b)
Run Code Online (Sandbox Code Playgroud)

我有疑问.到底是怎么回事?:)如果我添加约束(如你所知),我不能通过这种方式设计,我需要实现很多功能,如pointSub.

所以,有一些事情要考虑:)