-1

私はhaskellのクラスについて本当に混乱しています。私がコードを持っていた場合:

class GetResult n where res :: n -> Int
class (GetResult n) => Model n where
                                     starting :: Int -> [Int] -> n
                                     starting i j = .....
                                     test :: n -> n
                                     test n = ......

nは何のタイプですか?開始出力とテストはどのタイプを入力として受け取りますか?

4

2 に答える 2

4

あなたの混乱は、Haskellの型クラスがOOのクラスとは何の関係もないという事実によって引き起こされるかもしれません。最も重要なのは、型クラスはオブジェクトを記述せず、型を記述することです。

型クラスは、一連のメソッドを記述します。特定の型にこれらのメソッドを実装して、その型をクラスのインスタンスにすることができます。resしたがって、GetResultの型クラス定義は、「型nは、型のメソッドを実装することでGetResultのインスタンスにすることができます」と読み取ることができますn -> Int。つまりn、のインスタンスになりたいタイプですGetResult

Int例として、のインスタンスを作成する場合はGetResult、次のインスタンス宣言を使用できます。

instance GetResult Int where
    res :: Int -> Int
    res i = i

この場合nはですInt

于 2012-05-16T23:55:44.583 に答える
4

nは型変数であり、特定の型ではありません。GetResult特定の型はとのインスタンスにすることができModel、各インスタンスはクラスで定義された関数の型の「空白を埋める」でしょう。

したがって、完全なタイプは次のstartingとおりです(これはghciから取得できます:t starting):

starting :: Model n => Int -> [Int] -> n

これは、「のインスタンスである任意のタイプの場合、およびModelstarting取り、そのタイプの値を返す」と読むことができます。同様に、のインスタンスである任意のタイプを取り、同じタイプの値を返します。Int[Int]testModel

特定の呼び出しではstarting、返されるタイプはコンテキストによって決定されます。戻り値がそのコンテキストで使用されているタイプの値を返します(適切なインスタンスが存在することを前提としています)。

于 2012-05-16T23:59:26.567 に答える