接受ehird的答案。我只是写这个,所以我可以解释我在评论中提到的智能析构函数,我不能在评论中适合解释。
比方说,你有类型:
data T x y z = A | B x | C y z
ehird已经解释的构造,这是多么抽象掉,以提供“智能”的构造。就像你提到的,这需要隐藏构造函数,然后你不能用它们来模式匹配。但是,您可以使用“智能”析构函数来解决此问题,这相当于针对每个可能的构造函数进行模式匹配。
为了解释这一点,让我们先用我们怎么会写类型T的函数开始,如果构造函数暴露:
myFunction :: T x y z -> d
myFunction t = case t of
A -> f1
B x -> f2 x
C y z -> f3 y z
我们从函数的类型签名知道类型的f1
,f2
,和f3
必须是:
f1 :: d
f2 :: x -> d
f3 :: y -> z -> d
所以,如果我们要概括myFunction
是一个聪明的析构函数,我们只是通过f1
,f2
和f3
作为参数传递给它:
smartDestructor :: d -> (x -> d) -> (y -> z -> d) -> t -> d
smartDestructor f1 f2 f3 t = case t of
A -> f1
B x -> f2 x
C y z -> f3 y z
因此,如果您导出smartDestructor
,那么人们基本上可以模式匹配对你的类型,而无需访问构造函数。
如果你曾经使用过的maybe
或either
功能之前,那么你已经使用了智能的析构函数,虽然在这些情况下构造不会隐藏,所以他们主要是为提供方便的功能:
maybe :: b -> (a -> b) -> Maybe a -> b
maybe f1 f2 m = case m of
Nothing -> f1
Just a -> f2 x
either :: (a -> c) -> (b -> c) -> Either a b -> c
either f1 f2 e = case e of
Left a -> f1 a
Right b -> f2 b
就你而言,智能析构函数的目的就是让你可以隐藏构造函数而不会暴露构造函数。
可能重复的[如何使限制类型](http://stackoverflow.com/questions/7978191/how-to-make-a-type-with-restrictions) – ehird 2012-04-15 09:57:43