是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