型クラスの複数の型パラメーター?

Cubi73

Stack1つのインスタンスを持つ型クラスがあると仮定しましょうList

class Stack a where
    push :: a -> Integer -> a
    pop :: a -> a
    last :: a -> Integer

data List = Empty | Element Integer List
instance Stack List where
    push list value = Element value list
    pop Empty = error "No elements"
    pop (Element _ list) = list
    last Empty = error "No elements"
    last (Element value _) = value

に制限されないようStackにするには、どのように定義する必要ListがありIntegerますか?

-- class Stack (?) where ...
data List a = Empty | Element a (List a)
-- instance Show (List a) where ...
ウィレムヴァンオンセム

その場合、マルチパラメータクラスを作成できます。

class Stack a b where
    push :: a -> b -> a
    pop :: a -> a
    last :: a -> b

そしてそれを次のように定義します:

instance Stack (List b) b where --You don't need to use `b`, but this make it easier to understand
    push list value = Element value list
    pop Empty = error "No elements"
    pop (Element _ list) = list
    last Empty = error "No elements"
    last (Element value _) = value

これはデフォルトの(標準化された)Haskell機能ではなく、オンにする必要があることに注意してください。渡すことによって、どちらか-XMultiParamTypeClasses-XFlexibleInstancesコンパイラに。

またはあなたは書くことができます:

{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances #-}

ソースファイルのヘッダーにあります。


インスタンスを定義するb1つに複数が存在する可能性があることに注意してくださいa(またはその逆)。これにより、そのようなクラスでの作業が困難になる可能性があります。たとえば、Dummyタイプを記述したとします

data Dummy = Dummy

以下を定義できます。

instance Stack Dummy b where
    push x = const x
    pop = id
    last = const $ error "Dummy object"

今、それはあなたが持っていることを意味しStack、すべての可能性のためのインスタンスをbので、あなたができること、pushおよびpopへのもののすべての種類Dummyのオブジェクト。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

複数の型パラメーターを使用した型クラスの使用

分類Dev

汎用Java関数が使用する「型パラメータ」の「クラス型」

分類Dev

Java内部クラスでの型パラメーターの作成

分類Dev

Javaの型パラメーターのクラス名?

分類Dev

関数パラメーターとしてのサブクラス型

分類Dev

複数の「パラメータ」を持つKotlin列挙型

分類Dev

Javaクラスの送信方法パラメータの型

分類Dev

ジェネリック型のクラスパラメータ

分類Dev

Scala型パラメーターに複数のジェネリック型制約を課す

分類Dev

内部クラスの型パラメーターに基づく型宣言

分類Dev

パラメータ化されたクラスの型引数を取得する

分類Dev

非型パラメーターを持つクラスの非型パラメーターを持つメンバー関数の部分的な特殊化

分類Dev

関数のジェネリック型パラメーター

分類Dev

クラスパラメータと戻り値の型注釈

分類Dev

クラス型の可変パラメータ-Java

分類Dev

型クラスパラメータのClassTag

分類Dev

列挙型からのクラスパラメータ

分類Dev

1つの変数に複数の型(パラメーター/戻り値の型)

分類Dev

複数型コンストラクターの挿入

分類Dev

複数の型パラメーターを作成しないJavaタプル

分類Dev

パターンマッチング方法及びクラス型パラメータの型推論の間の差

分類Dev

CVC4の型パラメーターを持つカスタムデータ型の引数なしコンストラクターの呼び出し

分類Dev

クラス値パラメーターの型メンバーの型の不一致

分類Dev

クラスパラメータとしてのパス依存型の使用

分類Dev

Jestでの関数パラメーターデータ型のテスト

分類Dev

Haskell:複数のパラメータを持つデータ型の型を取得する方法( `Path ab = ..`など)

分類Dev

複数の境界を持つコンパイル時型パラメータ

分類Dev

ジェネリックス-関数の戻り型はパラメータ型と同じですか?

分類Dev

複数の型パラメーター制約のC#ジェネリック構文

Related 関連記事

  1. 1

    複数の型パラメーターを使用した型クラスの使用

  2. 2

    汎用Java関数が使用する「型パラメータ」の「クラス型」

  3. 3

    Java内部クラスでの型パラメーターの作成

  4. 4

    Javaの型パラメーターのクラス名?

  5. 5

    関数パラメーターとしてのサブクラス型

  6. 6

    複数の「パラメータ」を持つKotlin列挙型

  7. 7

    Javaクラスの送信方法パラメータの型

  8. 8

    ジェネリック型のクラスパラメータ

  9. 9

    Scala型パラメーターに複数のジェネリック型制約を課す

  10. 10

    内部クラスの型パラメーターに基づく型宣言

  11. 11

    パラメータ化されたクラスの型引数を取得する

  12. 12

    非型パラメーターを持つクラスの非型パラメーターを持つメンバー関数の部分的な特殊化

  13. 13

    関数のジェネリック型パラメーター

  14. 14

    クラスパラメータと戻り値の型注釈

  15. 15

    クラス型の可変パラメータ-Java

  16. 16

    型クラスパラメータのClassTag

  17. 17

    列挙型からのクラスパラメータ

  18. 18

    1つの変数に複数の型(パラメーター/戻り値の型)

  19. 19

    複数型コンストラクターの挿入

  20. 20

    複数の型パラメーターを作成しないJavaタプル

  21. 21

    パターンマッチング方法及びクラス型パラメータの型推論の間の差

  22. 22

    CVC4の型パラメーターを持つカスタムデータ型の引数なしコンストラクターの呼び出し

  23. 23

    クラス値パラメーターの型メンバーの型の不一致

  24. 24

    クラスパラメータとしてのパス依存型の使用

  25. 25

    Jestでの関数パラメーターデータ型のテスト

  26. 26

    Haskell:複数のパラメータを持つデータ型の型を取得する方法( `Path ab = ..`など)

  27. 27

    複数の境界を持つコンパイル時型パラメータ

  28. 28

    ジェネリックス-関数の戻り型はパラメータ型と同じですか?

  29. 29

    複数の型パラメーター制約のC#ジェネリック構文

ホットタグ

アーカイブ