不確実性が伝播するApproximate
typeFunctor
の場合、 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->b
Approximate
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μ
liftA2
liftA2
しかし、これらの制約されたクラスは、liftA2
. 特に、CApplicative
すべての のインスタンスを許可しますが、 がベース メソッドの場合はCMonad
機能しません。そして、は常に よりも一般的であるべきである<*>#
ことに、私たちは皆同意していると思います。Applicative
Monad
圏論者はこれらすべてについて何と言うでしょうか? また、関連する制約を満たす必要liftAμ
なく一般的なものを取得する方法はありますか?a->b
*そのタイプの線形関数は、実際にはベクトル空間構造を持っていますが、それらに限定することはできません。