與C++

2010-04-02 13 views
36

這個問題更kinded類型是誰知道這兩個哈斯克爾(或支持更高kinded類型的任何其他函數式語言)和C++的人...與C++

是否可以使用較高kinded類型的建模C++模板?如果是,那麼如何?

編輯:

this呈現由託尼·莫里斯:

高階多態性:

  • 語言如Java和C#有 一級多態性,因爲他們 允許我們抽象類型。例如 List<A>可以有一個reverse功能 可以在任何元素類型( A)上工作。

  • 更實際的編程語言 和類型系統允許我們 抽象的類型構造爲 好。

  • 此功能被稱爲高階 (或更高主觀)多態性。

例子:

僞的Java與高階多態性

interface Transformer<X, Y> { 
    Y transform(X x); 
} 

interface Monad<M> { // M :: * -> * 
    <A> M<A> pure(A a); 
    <A, B> M<B> bind(Transformer<A, M<B>> t, M<A> a); 
} 
+1

也許你可以舉一個你的目標的例子。對我們來說,不知道功能成語是否會有幫助。 – GManNickG 2010-04-02 05:17:35

+1

@GMan:我可以舉一個例子,但我很清楚,除了那些已經知道它的人之外,這並不意味着什麼。所以我沒有打算加入一個例子。 – 2010-04-02 05:21:56

+1

@Venkat:我的意思是一個目標,你的大圖是什麼?您需要更高級的類型:__________。另外,一個非常簡單的評論示例仍然比沒有好。 :) – GManNickG 2010-04-02 05:24:22

回答

52

模板模板參數?

template <template <typename> class m> 
struct Monad { 
    template <typename a> 
    static m<a> mreturn(const a&); 

    template <typename a, typename b> 
    static m<b> mbind(const m<a>&, m<b>(*)(const a&)); 
}; 

template <typename a> 
struct Maybe { 
    bool isNothing; 
    a value; 
}; 

template <> 
struct Monad<Maybe> { 
    template <typename a> 
    static Maybe<a> mreturn(const a& v) { 
     Maybe<a> x; 
     x.isNothing = false; 
     x.value = v; 
     return x; 
    } 

    template <typename a, typename b> 
    static Maybe<b> mbind(const Maybe<a>& action, Maybe<b>(*function)(const a&)) { 
     if (action.isNothing) 
      return action; 
     else 
      return function(action.value); 
    } 
}; 
+2

那麼模板參數可以是模板本身?大!我不知道!感謝你的回答! :) – 2010-04-02 05:51:20

+11

我換句話說:C++中的模板系統是(意外)圖靈完成它是相當不可思議的,你可以用它做什麼:) – 2010-04-02 08:41:09

+1

什麼是可以用這個壽命構建的高階類型的最高等級?是'template