38

圏論から、 Setのすべての endfunctor が自由なモナドを認めているわけではないことがわかっています。標準的な反例はべき集合関数です。

しかし、Haskell は任意のファンクターを自由なモナドに変えることができます。

data Free f a = Pure a | Free (f (Free f a))
instance Functor f => Monad (Free f) where
  return = Pure
  Pure a >>= f = f a
  Free m >>= f = Free ((>>= f) <$> m)

この構築が Haskell ファンクターで機能するのに、Setでは機能しない理由は何ですか?

4

2 に答える 2

4

この答えが間違っていることが明らかになりました。誰かが正しい答えを策定するまで、コメントでの貴重な議論を維持するために、ここに残しておきます。


で設定された電力を考慮してくださいSet。関数 があれば、でf : S -> T形成できます。素敵な共変ファンクター (と思います)。素敵な反変ファンクターを形成することもできます (私はそう思います)。f' : PS S -> PS Tf' X = f [X]f'' X = f^(-1) [X]

Haskell の「パワーセット」を見てみましょう。

newtype PS t = PS (t -> Bool)

これはではなくFunctorのみContravariantです:

instance Contravariant PS where
  contramap f (PS g) = PS (g . f)

tはマイナスの位置にあるため、これを認識しています。とは異なりSet、ベキ集合を構成する特性関数の「要素」に到達できないため、共変関手は使用できません。

したがって、Haskell がすべての共変関手に対して自由なモナドを認めている理由は、 に問題を引き起こす共変関手が除外されているためだと推測しSetます。

于 2016-01-02T18:18:30.670 に答える
1

私は(むしろ)これが正確な定義ではないのではないかと疑っています。たとえば、この再帰式は修正点を指定ます。さて、この修正点が存在することをどうやって知るのでしょうか? 修正点が 1 つしかないことをどのようにして知ることができますか? Free m >>=さらに、 は何かをどのように定義しますFreeか?

于 2016-01-03T17:47:35.263 に答える