在数据声明Haskell中键入约束

时间:2016-11-27 04:56:03

标签: haskell types typeclass

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

data Scale s = Scale s s

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

2 个答案:

答案 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

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