在 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/