2010-04-02 18 views
36

Câu hỏi này là dành cho những người biết cả hai Haskell (hoặc bất kỳ ngôn ngữ chức năng khác hỗ trợ các loại cao-kinded) và C++ ...loại cao-kinded với C++

Có thể mô hình các loại kinded cao sử dụng Mẫu C++? Nếu có, thì làm thế nào?

EDIT:

Từ this trình bày bởi Tony Morris:

cao hơn bậc Polymorphism:

  • Ngôn ngữ như Java và C# có bậc nhất polymorphism vì họ cho phép chúng tôi tóm tắt về các loại. ví dụ. List<A> có thể có chức năng reverse hoạt động trên bất kỳ loại phần tử nào (số A).

  • Ngôn ngữ lập trình thực tế khác và loại hệ thống cho phép chúng tôi tóm tắt về các nhà xây dựng kiểu như .

  • Tính năng này được gọi là đa hình cao cấp hơn (hoặc cao cấp) đa hình.

Ví dụ:

Pseudo-Java với một ký hiệu được phát minh cho bậc cao đa hình

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

Có thể bạn có thể đưa ra ví dụ về mục tiêu của mình. Đối với chúng tôi, những loại không-biết-chức năng-thành ngữ-rất tốt sẽ giúp ích cho bạn. – GManNickG

+1

@GMan: Tôi có thể đưa ra một ví dụ, nhưng tôi biết rõ nó sẽ khó có ý nghĩa gì ngoại trừ những người biết điều đó. Vì vậy, tôi không bận tâm để bao gồm một ví dụ. –

+1

@Venkat: Ý tôi là mục tiêu, bức tranh lớn hơn của bạn là gì? Bạn muốn loại có mức độ cao hơn cho: __________. Ngoài ra, một ví dụ rất đơn giản với các bình luận sẽ vẫn tốt hơn là không có gì. :) – GManNickG

Trả lời

52

Thông số mẫu-mẫu?

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

Vì vậy, các tham số mẫu có thể là chính các mẫu? Tuyệt quá!Tôi không biết điều đó! Cảm ơn câu trả lời! :) –

+11

Tôi nói cách khác: hệ thống mẫu trong C++ là (vô tình) Turing Hoàn thành nó khá đáng kinh ngạc những gì bạn có thể làm với nó :) –

+1

thứ hạng cao nhất của loại thứ tự cao hơn có thể được xây dựng với tho này là gì? 'template