我正在使用Haskell并尝试编写以下内容:
data Scale s = Scale s s
但是,我想这样做s
必须是Num类型的东西,比如Int或Double。使用Haskell和GHC可以做到吗?
答案 0 :(得分:17)
是:
{-# LANGUAGE GADTs #-}
data Scale s where
Scale :: Num s => s -> s -> Scale s
但是,它通常被认为是不的最佳做法。相反,只将Num
约束放在使用Scale
和需要 Num
约束的函数上。放松这些限制可以让你在适当的时候暂时打破不变量;例如希望这种类型的Functor
实例是常见的,如果你像上面那样限制构造函数,这是不可能的。
答案 1 :(得分:6)
我遇到类似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)
我有疑问。到底是怎么回事? :)如果我添加约束(如你所知)我不能通过这种方式设计,我需要实现很多函数,如pointSub
。
所以,有一些事情要考虑:)