是GADTs功能语言相当于传统的OOP +泛型,或者有一种情况下GADT容易实施正确性约束,但使用Java或C#很难或不可能实现?GADT提供的OOP和泛型不能做什么?
例如,这种“良好类型的解释”哈斯克尔程序:
data Expr a where
N :: Int -> Expr Int
Suc :: Expr Int -> Expr Int
IsZero :: Expr Int -> Expr Bool
Or :: Expr Bool -> Expr Bool -> Expr Bool
eval :: Expr a -> a
eval (N n) = n
eval (Suc e) = 1 + eval e
eval (IsZero e) = 0 == eval e
eval (Or a b) = eval a || eval b
可以等同于Java中使用泛型和适当的执行每个子类来写的,但更详细:
interface Expr<T> {
public <T> T eval();
}
class N extends Expr<Integer> {
private Integer n;
public N(Integer m) {
n = m;
}
@Override public Integer eval() {
return n;
}
}
class Suc extends Expr<Integer> {
private Expr<Integer> prev;
public Suc(Expr<Integer> aprev) {
prev = aprev;
}
@Override public Integer eval() {
return 1 + prev.eval()
}
}
/** And so on ... */
有趣的问题。也许平等证人?我不确定它们是否可以用Java表示。 – gsg 2015-04-05 06:00:27
没有太多不共享的东西,但GADT使得Java中不可能实现的东西变得非常简单。我曾经用Java编写过'Maybe'类型的代码,总共有70行代码。在Haskell中,如果包含monad/functor实例,则它不会超过10_。 – AJFarmar 2015-04-05 07:26:46
@AJFarmar同意。虽然在Scala中它不像Java那么长。 – chi 2015-04-05 10:28:44