导出“模式匹配器”而不是“构造函数”

时间:2014-08-06 08:58:19

标签: haskell

如果我有一个包含

的模块
data Foo = Bar Int | Baz Bool

我可以将BarBaz导出为"模式匹配器"或者"析构者" 并且不允许模块用户使用它们构造类型Foo的值?

也就是说,我想允许使用

f (Bar i) = ... i ...

但阻止使用

x = Bar i

1 个答案:

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