1

コンパイルするHaskellコードは次のとおりです。

class Category categ where
  method1 :: categ a a
  method2 :: categ a b -> categ b c -> categ a c

しかし、私はその意味を理解していません:

  1. なにcateg?どのように定義できますか:dataまたはを通じてclass? 多分これはfunction
  2. abとは何cですか? として指定されていないため、

    class Category categ a b c where
        method1 :: categ a a
        method2 :: categ a b -> categ b c -> categ a c
    

    このコードはコンパイルされるべきではありません。

4

1 に答える 1

6
class Category categ where

これは型クラス宣言です。

という型クラスを宣言しCategoryます。theは、関連する関数でcateg実装されている型を参照するために使用される変数です。Category後であなたが言うときにそれを埋めます

instance Category Foo where
    ....

次にcateg、型クラスのメソッドで が使用されている場所で、メソッドを置き換えFooて定義します。

「次のメソッドがある場合、型categは aです」と読み上げます。Category


メソッドについては次のとおりです。

method1 :: categ a a
method2 :: categ a b -> categ b c -> categ a c

実装する型が実装する必要がある 2 つの関数を宣言しCategoryます。a最初のものは、任意の type に対してtype を返す引数なしの関数categ a aです。method2は、 と の 2 つのデータを受け取りcateg a bcateg b cを返しますcateg a c

ここa b cに型変数があります。これらは、関数が呼び出されたときに任意の具象型で埋められるプレースホルダーです。C++ または Java に精通している場合は、

template<typename A>
categ<A, A> method1();

Haskellにあるものにかなり近いです。Haskell では、型変数を宣言せずにそのまま使用します。それらは関数ローカルであり、 「 For any type a, the following code works 」のようなことを言っているのと同じです。


これは Haskell のかなり基本的なことです。Learn You A Haskellを読むことをお勧めします。これは無料で、投稿したばかりのコードのすべての側面をカバーします。

于 2013-09-04T03:23:38.537 に答える