为两个不同的值构造函数使用相同名称的 Haskell 方法是什么?
What's the Haskell way of using the same name for two different value constructors?
假设我想模拟经理和员工一对一商定的待办事项。待办事项可能必须由经理或员工来实现。假设我想处理有关员工的一些数据,所以我对员工建模如下:
data Employee = Employee
{ id :: Int
, name :: String
}
让我们进一步假设我会像这样模拟我的待办事项:
data Todo = Todo
{ id :: Int
, text :: String
, realizedBy :: RealizedBy
}
我发现像这样对 RealizedBy
类型建模最优雅:
data RealizedBy = Manager | Employee
当然这个是不会编译的,因为还有Multiple declarations of `Employee'
.
我想到的一个解决方案是不定义 RealizedBy
类型,而是像这样建模:
data TodoContent = TodoContent
{ id :: Int
, text :: String
}
data Todo = ManagerTodo TodoContent | EmployeeTodo TodoContent
对我来说,这似乎有点过度设计。对我来说,不得不重复 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
假设我想模拟经理和员工一对一商定的待办事项。待办事项可能必须由经理或员工来实现。假设我想处理有关员工的一些数据,所以我对员工建模如下:
data Employee = Employee
{ id :: Int
, name :: String
}
让我们进一步假设我会像这样模拟我的待办事项:
data Todo = Todo
{ id :: Int
, text :: String
, realizedBy :: RealizedBy
}
我发现像这样对 RealizedBy
类型建模最优雅:
data RealizedBy = Manager | Employee
当然这个是不会编译的,因为还有Multiple declarations of `Employee'
.
我想到的一个解决方案是不定义 RealizedBy
类型,而是像这样建模:
data TodoContent = TodoContent
{ id :: Int
, text :: String
}
data Todo = ManagerTodo TodoContent | EmployeeTodo TodoContent
对我来说,这似乎有点过度设计。对我来说,不得不重复 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