これは私を困惑させます。どのようにFunctorのインスタンスを書くかnewtype Mu f = InF {outF :: f (Mu f)}
Functorインスタンスfor(newtype Mu f = InF {outF :: f(Mu f)})
答えて
できません。 c
のインスタンスFunctor c
を定義するには、c
は* -> *
である必要があります。だからあなたのケースでは、Mu
はその種のものだったはずです。つまり、その引数f
は*
であったはずです。しかし、これは明らかではありません。f
を別のもの(Mu f
)に適用しているためです。 Mu
がファンクタた場合
もっと簡単に言えば、あなたはどんなf
用タイプMu f
の値にfmap
を使用することができます。しかし、これにより、タイプパラメータを他のタイプに変更することができました。例えば、の値をMu f
に適用すると、Mu Int
の値を返す必要があります。しかし、その値のoutF
には意味をなさないタイプInt (Mu Int)
があったので、そのような値を形成することはできません。
'Functor'(' * - > * ')で必要とされていないことを強調するために、明示的な種類の署名' Mu ::(* - > *) - > * 'を追加します。親切なエラーを取得します。 – chi
rednebはMu
は、通常のFunctor
することができない理由の良い説明を与えるが、私はそれが可能だろうか役に立つかわからないけど、あなたは
{-# LANGUAGE RankNTypes #-}
newtype Mu f = InF {outF :: f (Mu f)}
mumap :: Functor f => (forall a. f a -> g a) -> Mu f -> Mu g
mumap f (InF m) = InF $ f $ fmap (mumap f) m
としてMu
ためファンクタのようなマッピング操作の並べ替えを実装することができますあなたの場合。 :)
IOW 'Mu'は、タイプコンストラクタ' * - > * '(その変形は' for x x '' f x - > g x''の自然な変換です)のカテゴリからのファンクタで、Haskell型 '' 'と関数 –
Mu
のわずかな再フレージング、user2297560年代は異なる、ムーのためのFunctorのインスタンスを認めるのに十分である:
-- Natural transformations
type g ~> h = forall a. g a -> h a
class HFunctor f where
ffmap :: Functor g => (a -> b) -> f g a -> f g b
hfmap :: (Functor g, Functor h) => (g ~> h) -> (f g ~> f h)
newtype Mu f a = In { unIn :: f (Mu f) a }
instance HFunctor f => Functor (Mu f) where
fmap f (In r) = In (ffmap f r)
この製剤は、パトリシア・ニールの紙Haskell Programming with Nested Types: A Principled Approachから来ています。
- 1. F#TextEditor for web
- 2. FOR/fトークンのバッチファイル
- 3. F#on Mono for Android
- 4. パッケージ化F#for Mono
- 5. F#
- 6. F#
- 7. F#
- 8. Functorは(a - > b) - >(f a - > f b)であり、(cカテゴリ)=> c a b - > c(f a)(f b)とは何か?
- 9. それは(代替f、Foldable f)=> Monad fですか?
- 10. 実行F#コードは、F#は
- 11. F F#ソリューション対インタラクティブ#とWCF
- 12. [0-9] [A-F] [a-f]
- 13. 空白を返すFOR/F
- 14. F#for scripting:スクリプトファイルの場所
- 15. F#
- 16. F#
- 17. F#
- 18. F#
- 19. F *
- 20. BindingError F#
- 21. F#ツリー
- 22. F#3.0のF#powerpackの入手方法
- 23. "$ find。-type f -printf '%f \ n' -exec cat {} \; MY_OUTPUT_FILE"
- 24. F#バイナリツリーインプットタイプエラー
- 25. は、F#
- 26. F#System.TypeLoadException
- 27. F#ポインタメンバアクセッサ
- 28. F#IEvent.create
- 29. F#フォークパイプ
- 30. F# - パブリックリテラル
newtype Mu f a = InF {outF :: f(Mu f a)} 'を実行すると、'インスタンスFunctor f => Functor(Mu f) 'が可能です。これは 'Pure'コンストラクタなしでは' Free'です。 – user2297560
この問題を回避するにはhttps://github.com/ekmett/recursion-schemes/pull/23をチェックしてください。 – phadej
興味深いことに、これは第16章からの練習です。第1原則からの* HaskellプログラミングのFunctor *。 –