1

我需要在加载模块后向数据类型添加一些新的构造函数。伪代码可能看起来像这样:

import MyModule

data MyType = NewConstructor

在上面的例子MyType中,前面已经定义了MyModule。有没有办法做到这一点?

4

1 回答 1

4

你不能。数据类型已关闭。否则这是一件好事,你怎么能预测预先定义的函数的行为呢?

存在几种解决方法,这里有一些我想不到的:

  1. 使用函数作为构造函数。例如myExtendedType = MyType 42
  2. 使用您自己的类型和映射函数。例如data MyExtendedType = MyExtendedType; toMyType MyExtendedType = MyType 42
  3. 包装现有数据类型:

    import MyModule as Old
    
    data MyExtendedType = FromOld (MyType Int) | MyExtendedType
    
    foo (FromOld m) = Old.foo m
    foo MyExtendedType = undefined
    
于 2013-07-31T10:08:42.813 回答