Opt*_*ght 1 haskell types typeclass
如果必须设置约束,则创建的任何圆的半径必须大于零(半径> 0).怎么做?
data Point = Point Float Float deriving (Show)
data Radius = Radius Float deriving (Show)
data Shape = Circle Point Radius deriving (Show)
surface :: Shape -> Float
surface (Circle _ (Radius r)) = pi * r ^ 2
Run Code Online (Sandbox Code Playgroud)
如果方便,请提供更多示例,说明如何在各种情况下设置约束/验证.例如,数据电话可以具有正则表达式或特定的起始编号集(区号或国家代码等).
在数据类型字段上实现验证的最简单方法是不从模块中导出值构造函数,而是定义和导出在使用隐藏值构造函数实际构造和返回对象之前执行所需检查的函数.
一个简单的示例,有两种可能的方法来报告错误:
module MyModule
( Radius -- we do not export value constructors
, radius
, radius'
) where
data Radius = Radius Float deriving (Show)
radius :: Float -> Maybe Radius
radius r | r > 0 = Just (Radius r)
| otherwise = Nothing
radius' :: Float -> Radius
radius' r | r > 0 = Radius r
| otherwise = error "negative radius"
Run Code Online (Sandbox Code Playgroud)
这样,模块的用户只能通过您个人定义的函数创建新值,而不能通过值构造函数创建新值,这样可以使它们跳过所有检查.
| 归档时间: |
|
| 查看次数: |
138 次 |
| 最近记录: |