具有可见性约束的Haskell构造函数或工厂方法中的保护

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中对此的看法吗?ZeroSome(0)

编辑:好的,谷歌搜索更多我终于找到了Haskell Factory Function条目,这似乎是答案的一部分.

Eri*_*ikR 6

要使构造函数成为私有,只是不要导出它,例如:

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,但不能ZeroSome ....

关键是Bar导出列表中的.如果您已指定:

module Foo (Bar(..), ...) where
Run Code Online (Sandbox Code Playgroud)

那么构造函数Bar也将被导出.