12

確実性が伝播するApproximatetypeFunctorの場合、 throughのインスタンスが必要Monadです。ただし、含まれている型にベクトル空間構造が必要なため、これは機能しません。実際には、クラスの制限されたバージョンである必要があります。それらの標準ライブラリはまだないようです(またはありますか?私を指摘してください。rmonadがありますが、それはコンテキストの種類としてでは*なく使用されます。これは私には時代遅れのようです)、私は独自のバージョンを作成しました当分の間。Constraint

それはすべて簡単に機能しますFunctor

class CFunctor f where
  type CFunctorCtxt f a :: Constraint
  cfmap :: (CFunctorCtxt f a, CFunctorCtxt f b)  => (a -> b) -> f a -> f b

instance CFunctor Approximate where
  type CFunctorCtxt Approximate a = FScalarBasisSpace a
  f `cfmap` Approximate v us = Approximate v' us'
   where v' = f v
         us' = ...

の直訳ですがApplicative、のように

class CFunctor f => CApplicative' f where
  type CApplicative'Ctxt f a :: Constraint
  cpure' :: (CApplicative'Ctxt f a) => a -> f a
  (#<*>#) :: ( CApplicative'Ctxt f a
             , CApplicative'Ctxt f (a->b)
             , CApplicative'Ctxt f b)        => f(a->b) -> f a -> f b

関数a->bには必要なベクトル空間構造* がないため、不可能FScalarBasisSpaceです。

ただし、機能するのは、制限された適用クラスの定義を変更することです。

class CFunctor f => CApplicative f where
  type CApplicativeCtxt f a :: Constraint
  cpure :: CAppFunctorCtxt f a  => a -> f a
  cliftA2 :: ( CAppFunctorCtxt f a
             , CAppFunctorCtxt f b
             , CAppFunctorCtxt f c )        => (a->b->c) -> f a -> f b -> f c

そして、自由な関数として<*>#ではなく定義するcliftA2

(<*>#) = cliftA2 ($)

メソッドの代わりに。制約がなければ、それは完全に同等です (実際、とにかく多くのApplicativeインスタンスがこのようになります)。しかし、この場合は実際にはより良いです:満たすことができない(<*>#)制約がまだありますが、それは適用可能なインスタンスを傷つけることはありません。次のような便利なことはまだできますa->bApproximate

ghci> cliftA2 (\x y -> (x+y)/x^2) (3±0.2) (5±0.3)        :: Approximate Double 
0.8888888888888888 +/- 0.10301238090045711

たとえば、制約の種類に関する元のブログ投稿で既に示されている例などCApplicative、の他の多くの用途でも状況は本質的に同じであると思います。Set

だから私の質問:

より<*>も基本的なものliftA2ですか?

繰り返しますが、制約のない場合、それらはとにかく同等です。実際にはliftA2理解しやすいと思いますが、Haskellでは、オブジェクトのコンテナとそれらを結合するための「グローバル」操作ではなく、「関数のコンテナ」を渡すことを考える方がおそらく自然です。そして、 だけでなく、すべてのμ ∊ ℕを<*>直接誘導します。だけからそれを行うことは、実際には機能しませんliftAμliftA2liftA2

しかし、これらの制約されたクラスは、liftA2. 特に、CApplicativeすべての のインスタンスを許可しますが、 がベース メソッドの場合はCMonad機能しません。そして、は常に よりも一般的であるべきである<*>#ことに、私たちは皆同意していると思います。ApplicativeMonad

圏論者はこれらすべてについて何と言うでしょうか? また、関連する制約を満たす必要liftAμなく一般的なものを取得する方法はありますか?a->b


*そのタイプの線形関数は、実際にはベクトル空間構造を持っていますが、それらに限定することはできません。

4

1 に答える 1

11

私が理解しているように(非---カテゴリー理論家として)、基本的な操作はzip :: f a -> f b -> f (a, b)(効果的な計算のペアを効果的な計算にマッピングしてペアにする)ことです。

その後、定義できます

  • fx <*> fy = uncurry ($) <$> zip fx fy
  • liftA2 g fx fy = uncurry g <$> zip fx fy

Typeclassopediaで見つけた、 Edward Yang によるこの投稿を参照してください。

于 2012-11-29T12:53:52.640 に答える