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
约束只能在使用功能的Scale
S和需要的Num
约束.放松这些限制可以让你在适当的时候暂时打破不变量; 例如,希望Functor
这种类型的实例是常见的,如果你像上面那样限制构造函数,这是不可能的.
我的类型情况类似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
.
所以,有一些事情要考虑:)
归档时间: |
|
查看次数: |
2005 次 |
最近记录: |