在C#中,我可以声明以下内容:
在Haskell中,我会将上面的内容键入为:
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#的方式有些类似)?
f
是一个重载函数。与继承完全无关,重载函数将始终需要定义为类型类。实际上,Haskell的类型类与函数重载比与OOP“类”更相似。 - C. A. McCann