Har*_*ald 1 haskell factory-pattern
对Haskell而言是新手并进行实验我遇到了一个问题,看起来我想在构造函数中使用守卫.我真正的实验涉及更多,但它归结为类似的东西
data X a = Zero
| a==0 = Zero
| otherwise = Some a
Run Code Online (Sandbox Code Playgroud)
我知道这是错误的语法,特别是因为它a
是一个类型变量,而不是一个值变量,所以a==0
无论如何都是无意义的.
背景是价值Zero
并且Some 0
在所有方面都应该相等,我甚至会说相同.事实上,我从来不想构造一个Some 0
,这应该被禁止,或者如上所述,默默地转换为Zero
已经在构造函数中.
我认为Haskell中有一个共同的习惯用法.在Java中,我只需要创建两个构造函数private
并提供工厂方法来创建一个或另一个而不是some(0)
返回.这也是你在Haskell中对此的看法吗?Zero
Some(0)
编辑:好的,谷歌搜索更多我终于找到了Haskell Factory Function条目,这似乎是答案的一部分.
要使构造函数成为私有,只是不要导出它,例如:
module Foo (Bar, mkBar) where
data Bar = Zero | Some a | ...
mkBar :: Int -> Bar -- exported smart constructor
mkBar a = ...
Run Code Online (Sandbox Code Playgroud)
库的用户可以使用该mkBar
函数来创建Bar
,但不能Zero
或Some ...
.
关键是Bar
导出列表中的.如果您已指定:
module Foo (Bar(..), ...) where
Run Code Online (Sandbox Code Playgroud)
那么构造函数Bar
也将被导出.