标称类型绑定到特定函数

Jam*_*bes 1 f# haskell types domain-driven-design

是否有一种语言或类型系统支持定义只能通过特定功能实例化的类型.

示例可以NonZeroInteger是绑定到函数的类型CreateNonZeroInteger.任何外部代码都可以访问此类型的类型,接收和返回值.但至关重要的是,只能通过调用函数来创建该类型的值CreateNonZeroInteger

NonZeroInteger应该名义上打字.具有相同结构的另一种类型的值不应与此类型相当或可浇铸.

Ale*_*ing 7

创建一个类型,定义一个函数来创建该类型的值,然后导出类型和函数,但不导出类型的数据构造函数.例如,在Haskell中,给出了您的示例:

module My.Module.NonZeroInteger (NonZeroInteger, createNonZeroInteger) where

newtype NonZeroInteger = NonZeroInteger Integer
  deriving (Show, Eq, Ord)

createNonZeroInteger :: Integer -> Maybe NonZeroInteger
createNonZeroInteger 0 = Nothing
createNonZeroInteger x = Just $ NonZeroInteger x
Run Code Online (Sandbox Code Playgroud)

消费者My.Module.NonZeroInteger将能够创建类型的值NonZeroInteger,但由于数据构造函数未导出,他们将无法创建NonZeroInteger内部的s 0.

在这种情况下createNonZeroInteger,自定义构造函数传统上称为"智能构造函数".