c# - Haskell 中的 OOP 样式继承

标签 c# oop haskell

在 C# 中我可以声明以下内容

class A {
    int Field;
}

class B : A {
    int Field2;
}

static int f(A a) { return a.Field; }
static int f(B b) { return a.Field + b.Field2; }

static void Main(string[] args) {
    A a = new A() { Field = 1 };
    A b = new B() { Field = 1, Field = 2};

    Console.WriteLine(f(a) + f(b));
}

在 Haskell 中,我会将上面的内容输入为

data A = A { field :: Int } | B { field :: Int, field2 :: Int }

f :: A -> Int
f (A a) = a
f (B a b) = a + b

main :: IO()
main = do putStrLn $ show (f(a) + f(b))
    where a = A 1
          b = B 1 2

我不喜欢 Haskell 对应的地方是我必须在 A 的数据定义中重复 field 两次(随着A 中需要出现在 B 中的字段会增加)。 Haskell 中是否有更简洁的方法将 B 编写为 A 的子类(有点类似于 C# 方式)?

最佳答案

如果 A 有很多字段,一种可能有意义的设计是为 A 和 B 设置两种不同的数据类型,其中 B 包含 A,然后使用类型类来定义 f。像这样:

data A = A {field1 :: Int, field2 :: Int, ..., field9999 :: Int}
data B = B {a :: A, field10000 :: Int}

class ABC a where
    f :: a -> Int

instance ABC A where
    f a = field1 a + field101 a

instance ABC B where
    f b = f (a b) + field10000 b

关于c# - Haskell 中的 OOP 样式继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3258824/

相关文章:

c# - 具有包含和可为空值的 Linq 查询

c# - 如何使单例设计可测试?

c++ - 在不让客户端等待程序执行的情况下限制构造函数可以采用的值

performance - 为什么差异列表比 Haskell 中的常规串联更有效?

haskell - 模式匹配与 guard 混合

c# - 查找 LDAP 用户的管理器

c# - 如何模拟 CellSet 对象

c# - 接口(interface)可以在 C# 中有静态变量吗

c++ - 为工厂方法使用堆栈分配而不是堆分配

haskell - Euterpea异常:未找到MIDI输出设备