2

Monad Transformers Step by Stepを読んでいます。6 ページで、 のいくつかのサブクラスを紹介しながらMonad、筆者は次のコード例を示しています。

class (Monad m) => MonadError e m | m -> e where
    throwError :: e -> m a
    catchError :: m a -> (e -> m a) -> m a

class (Monad m) => MonadReader r m | m -> r where
    ask :: m r
    local :: (r -> r) -> m a -> m a

その| m -> e部分はどういう意味ですか?

4

1 に答える 1

4

それは機能的な依存関係です。これは GHC で利用可能な拡張機能です。ここで詳細を読むことができますが、それらが伝える基本的な考え方は、タイプの 1 つが他のタイプを「決定する」ということです。型ファミリは同じ情報やそれ以上の情報をより簡単に、より機能的に伝えることができるため、最近は支持されなくなりました。

編集: 1年前にこのトピックについて私が尋ねた質問から取られた例。

関数の依存関係を使用して、このコードから始めました。

class Shuffle a b | a -> b where
  indices    :: a -> Array Int b
  reorganize :: a -> Array Int b -> a

@ehird はこの解決策で応答しました:

class Shuffle a where
  type Elt a
  indices    :: a -> Array Int (Elt a)
  reorganize :: a -> Array Int (Elt a) -> a

つまり、本質的には、「a が b を決定する」という矢印「a -> b」が、「a」が型変数で、型「b」が型クラス内にリストされている型ファミリーに変更されるということです。

于 2013-03-04T21:22:55.963 に答える