私はソースコードData.Has
を探していて、どのように動作するかを調べようとしていました。次のコードは、誰かがa :: A
とb :: B
という2つの値を「a
」と「b
」の両方の機能を持つ新しい値に「結合」できるようにするためのコードだと考えています。クラス宣言とインスタンス宣言の型キーワード
私は特に、type
がクラス宣言とインスタンス宣言の中にあることを理解していません。
また、~
シンボルの意味は分かりません。
誰かが下記のコードをData.Has.TypeListから説明できますか?型クラスおよびインスタンス宣言内部
-- | Provides type-list functionality
module Data.Has.TypeList where
import Control.Applicative
import Data.Monoid (Monoid (..))
import Test.QuickCheck (Arbitrary (..), CoArbitrary (..))
import Data.Typeable
import Data.Data
-- | Cons a type onto type-list.
data a ::: b = a ::: b deriving (Show,Eq,Ord,Read,Bounded,Typeable,Data)
-- | The empty type-list.
data TyNil = TyNil deriving (Read,Typeable,Data)
-- | Appends a type-list and another.
class Append a b where
type a :++: b
(.++.) :: a -> b -> a :++: b
infixr 5 :++:
-- Implementation of Append
instance Append TyNil b where
type TyNil :++: b = b
_ .++. b = b
instance (Append y b) => Append (x ::: y) b where
type (x ::: y) :++: b = x ::: (y :++: b)
~(x ::: y) .++. b = x ::: (y .++. b)
これらは、関連タイプの同義語と呼ばれます。これらの構文は関数の依存関係に似ていますが、関係の代わりに型関数を使用します。 –