cau*_*ima 1 constructor haskell types
假设我想对经理和员工之间一对一商定的待办事项进行建模。待办事项可能必须由经理或员工来实现。假设我想处理有关员工的一些数据,因此我对员工进行建模,如下所示:
data Employee = Employee
{ id :: Int
, name :: String
}
Run Code Online (Sandbox Code Playgroud)
进一步说,我将像这样建模我的待办事项:
data Todo = Todo
{ id :: Int
, text :: String
, realizedBy :: RealizedBy
}
Run Code Online (Sandbox Code Playgroud)
我发现RealizedBy像这样建模 -type 是最优雅的:
data RealizedBy = Manager | Employee
Run Code Online (Sandbox Code Playgroud)
当然,这是不会编译的,因为有Multiple declarations of `Employee'.
我想出的一个解决方案是不定义 -type RealizedBy,而是像这样建模:
data TodoContent = TodoContent
{ id :: Int
, text :: String
}
data Todo = ManagerTodo TodoContent | EmployeeTodo TodoContent
Run Code Online (Sandbox Code Playgroud)
对我来说,这似乎有点过度设计。对我来说,必须重复TodoContent并不是那么优雅。另外,我想不出比Employee类型或无参数构造函数(或任何所谓的名称)更好的名称来对数据进行建模。我无法摆脱这样的感觉:我可能会错过一些明显的东西,可以更优雅地解决这个问题。我是吗,或者这真的是 Haskell 中建模的方式吗?
Haskell 只有一种用于数据声明命名空间的机制,即它的模块系统。您可以在这里使用它。
module Classifications where
data RealizedBy = Manager | Employee
module Entities where
import qualified Classifications as C
data Employee = Employee Int String
data Todo = Todo Int String C.RealizedBy
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
251 次 |
| 最近记录: |