为两个不同的值构造函数使用相同名称的 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