如果我有一个包含
的模块data Foo = Bar Int | Baz Bool
我可以将Bar
和Baz
导出为"模式匹配器"或者"析构者" 仅并且不允许模块用户使用它们构造类型Foo
的值?
也就是说,我想允许使用
f (Bar i) = ... i ...
但阻止使用
x = Bar i
答案 0 :(得分:5)
没有。模式匹配在terms of constructors中定义。您可以export他们,因此可以让用户模式匹配和创建新的Foo
,或者您不会。
如果您只是想阻止用户创建某种内部类型,您可以使用中间类型:
module Foo (Foo, FooRep(..), toRep) where
data Foo = Bar Int | Baz Bool
data FooRep = BarR Int | BazR Bool
toRep (Bar i) = BarR i
toRep (Baz b) = BazR b
import Foo
f foo = case (toRep foo) of
BarR i -> ...
BazR b -> ...