答案 0 :(得分:7)
我认为你要找的是Smart constructor。
PolyRing
的基本大写构造函数不能重载。但你能做的就是:
polyRing :: (Num a, IntegerAsType n) => [a] -> PolyRing a n
polyRing = PolyRing . take 3
或者,甚至更好:
polyRing :: (Num a, IntegerAsType n) => [a] -> Maybe (PolyRing a n)
polyRing (a:b:c:_) = Just $ PolyRing [a, b, c]
polyRing _ = Nothing
为防止有人直接使用PolyRing
构造函数,文件顶部的模块导出声明可能如下所示:
module PolyRing (
PolyRing (), -- Export the PolyRing type but not constructor
polyRing -- Your smart constructor
) where
在OO中,封装的单位是类,但在Haskell中,它是模块。