Stack
1つのインスタンスを持つ型クラスがあると仮定しましょう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 #-}
ソースファイルのヘッダーにあります。
インスタンスを定義するb
1つに複数のが存在する可能性があることに注意してください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]
コメントを追加