Mにモナド的に自然な非同一モナドモーフィズムM〜> Mはありますか?


8

型シグネチャによる自然変換はa -> a恒等関数でなければならないことが知られています。これは米田補題に続くが、直接導出することもできる。この質問は同じ性質を求めますが、自然な変換ではなくモナド射を求めます。

モナドM ~> N間のモナド射を考えます。(これらはM a -> N a、両側でモナド演算を保持する自然な変換です。これらの変換は、モナドのカテゴリーの射です。)e :: (Monad m) => m a -> m aすべてのモナドで同じように機能するモナド射が存在するかどうかを確認できますm。言い換えると、モナドモーフィズムeは、モナドタイプパラメータでモナド的に自然でなければなりませんm

モナド自然法則によれば、任意の2つのモナドMとNの間のモナドモーフィズムf:M a-> N aについてはf . e = e . f、適切な型パラメーターが必要 です。

問題は、そのようなeものは恒等関数でなければならないことを証明できるか、またはe次のように定義された非恒等モナド射の反例があるかどうかです。

  e :: (Monad m) => m a -> m a
  e ma = ...

そのような定義に失敗した試みの1つeは次のとおりです。

 e ma = do
         _ <- ma
         x <- ma
         return x

別の失敗した試みは

 e ma = do
         x <- ma
         _ <- ma
         return x

これらの試みは両方とも正しい型シグニチャーを持っていますが、モナド射法則に失敗しています。

単位モナドUnit ~> Mがどこにあるかモナド射がないため、米田補題はこの場合には適用できないようUnitです。また、直接証拠を見つけることもできません。

回答:


2

あなたはすでにすべての興味深い可能性を使い果たしていると思います。どれでもMonad m => m a -> m a私たちが定義する可能性がある機能は必然的に次のようになります。

e :: forall m a. Monad m => m a -> m a
e u = u >>= k
    where
    k :: a -> m a
    k = _

具体的には、もしk = returne = id。以下のためeではないとidk使用しなければならないu (例えば、非自明な方法で、k = const uかつk = flip fmap u . const量あなたの2回の試行に)。ただし、そのような場合、u効果は重複eするため、モナドのいくつかの選択肢でモナドモーフィズムになりませんm。そのため、モナドで完全に多態性を示す唯一のモナドモーフィズムはidです。


引数をより明確にしましょう。

わかりやすくするために、少しの間、join/ return/ fmapプレゼンテーションに切り替えます。実装したいもの:

e :: forall m a. Monad m => m a -> m a
e u = _

右側を何で満たすことができますか?最も明白な選択はuです。それ自体ではe = id、は面白くありません。ただし、およびもあるのでjoin、基本ケースとしてを使用して帰納的に推論するオプションがあります。たとえば、手元にある手段を使用して構築されたがあるとします。それ以外にも、以下の可能性があります。returnfmapuv :: m av

  1. join (return v)でありv、したがって、何も新しいことを教えてくれません。

  2. join (fmap return v)であり、これvも同様に、そして

  3. join (fmap (\x -> fmap (f x) w) v)w :: m a私たちのルールに従って構築された他のものと、いくつかのためにf :: a -> a -> a。(追加mのタイプに層fのように、a -> a -> m aと、余分なjoinのを私たちはその後、これらの層の出所を表示しなければならないとして、どこにもつながらないそれらを削除するには、物事は最終的には他のケースに減少するであろう。)

唯一の興味深いケースは#3です。この時点で、ショートカットを作成します。

join (fmap (\x -> fmap (f x) w) v)
    = v >>= \x -> fmap (f x) w
    = f <$> v <*> w

任意の非u右側は、従って、形で表すことができるf <$> v <*> wと、vそしてwいずれかでu、最終的に到達する、またはこのパターンのさらなる反復uの葉で秒。ただし、この種の適用表現は、適用法則を使用(<*>)して左側のすべての使用を再関連付けすることによって取得される標準的な形式を持っています。この場合は、このようになります...

c <$> u <*> ... <*> u

...省略記号は、ゼロまたはそれ以上のさらなる発生放置とuによって分離され<*>、そしてcあるa -> ... -> a -> a適切なアリティの機能。aは完全にポリモーフィックであるためc、パラメトリックconst性により、引数の1つを選択するような関数である必要があります。そういうわけで、そのような表現は(<*)andの観点から書き直すことができます(*>)...

u *> ... <* u

...のゼロまたはそれ以上のさらなる発生のために立って省略記号とのuいずれかで区切られていない*><*、全くそこにいる*>の右側にあります<*

最初に戻ると、id候補以外のすべての実装は次のようになります。

e u = u *> ... <* u

またe、モナド射になりたいです。結果として、それは適用可能な射でもあるに違いありません。特に:

-- (*>) = (>>) = \u v -> u >>= \_ -> v
e (u *> v) = e u *> e v

あれは:

(u *> v) *> ... <* (u >* v) = (u *> ... <* u) *> (v *> ... <* v)

これで、反例への明確な道筋ができました。適用法則を使用して両側を標準形に変換する場合、左側にはインターリーブされたusとvsが、右側にはすべてvのsの後にすべてuのs が(まだ)残ります。プロパティは、モナドのために保持しないことを意味しますが好きIOStateまたはWriter、関係なく、どのように多くの(*>)(<*)、そこにあるe、または正確な値がで選ばれていますconstいずれかの側の様な機能。簡単なデモ:

GHCi> e u = u *> u <* u  -- Canonical form: const const <$> u <*> u <*> u
GHCi> e (print 1 *> print 2)
1
2
1
2
1
2
GHCi> e (print 1) *> e (print 2)
1
1
1
2
2
2

十分に厳密な証拠を見つけることができません。の効果u必然的に複製されることを証明するにはどうすればよいe = idですか?(e u = do _ <- u; _ <- u; _ <- u; uさらに- u効果を記述して組み合わせることもできます。)「モナディック値にp :: m aは複数の効果がコピーされていることを数学的u :: m aにどのように説明できますか?そして、どのようにして重複(三重など)u効果が必ず違反につながるかを証明できますか?モナド射法則?
winitzki

@winitzki私は私の主張をより明確に書き留めました。私が観察した失敗が効果の交換可能性にもっと関係していることを考えると、私が答えの最初の改訂で確かにコミットした1つの思想はべき等性に言及していました。
duplode

これは面白い。私はそれについてもっと考えなければならないでしょう。重要なを実装する方法が1つしかないことe u、つまりu *> ... <* u、あなたが説明したフォームの式を使用する方法が1つしかないことをどのように証明できますか?なぜ我々はいくつかの他の巧妙かつ複雑な組み合わせを見つけることができないfmapreturnjoin私たちは何かを得るようにすることを、?応用射を検討することも良い動きです。モナド射よりも、射射射に類似の特性を証明する方が簡単かもしれません。(適用可能な自然な唯一の適用可能な射は、正体射です?)
winitzki

@winitzki(1)より結晶性の高いプレゼンテーションを作成することは良いことですが(私はまだそれについて考えています)、私の3つのケースは網羅的だと思います。join _id結果のみにつながる可能性があり、#3はid無限回帰につながらない唯一の方法です。(2)オンApplicative:非公式に、唯一のクライスリ矢印がreturnである場合、追加のパワーをMonad持っていないので、で作業することもできますApplicative。(3)うん、類似の性質が適用射射に当てはまる。自己完結型である標準形から始まる私の議論の一部は証明として十分であろう。
duplode

モナド的に自然なモナドモーフィズムがあれば、適用可能な自然な適用モーフィズムも得られます。そのような応用射がないことを証明する方が簡単かもしれません。
winitzki
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.