Haskell 对两个不同的值构造函数使用相同名称的方式是什么?

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 中建模的方式吗?

Dan*_*ner 5

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)