6

binary簡単な質問ですが、パッケージは 2 つの型を定義しているGetことPutを願っています。前者は本質的に状態モナドであり、後者は本質的にライターです。状態とライターの両方に合理的なMonadFixインスタンスがあるため、私はそれを期待していますし、そうするGetでしょPutう。

Getします。Putしません。では、 (本当に) の適切なMonadFixインスタンスを定義することは可能ですか?PutPutM

より一般的な質問は、型クラスのインスタンスがその型クラスの法則を実際に満たしていることを通常どのように検証するのでしょうか?

4

2 に答える 2

7

バイナリ パッケージ ( Data.Binary.Put:71 )のソースでわかるように、モナド値に使用されるデータ構造はビルダーで厳密です。モナドから値を抽出するには、値が見つかった構造を強制する必要があるため、ビルダーが入力に依存している場合、これにより無限ループが発生します。

data PairS a = PairS a !Builder
newtype PutM a = Put { unPut :: PairS a }

したがって、MonadFixインスタンスを作成することはできますが、それを使用して何か有用なことを行うことはできません。しかし、モナドは基本的に(しかし特殊な実装を使用して)あるため、とにかくここで有用なことは何もできないと思います。MonadFix少なくとも、単純な古いものでできないことは何もありません。fixPutMWriter Builder

2 番目の質問については、最初の質問とは関係ないので、別の質問として質問してください。

于 2012-06-17T03:03:29.143 に答える
1

2 番目の質問への回答と、ダニエルのコメントへのフォローアップを次に示します。あなたは手で法律を確認します.私はFunctor法律の例を次のように使用しますMaybe:

-- First law
fmap id = id

-- Proof
fmap id
= \x -> case x of
    Nothing -> Nothing
    Just a  -> Just (id a)
= \x -> case x of
    Nothing -> Nothing
    Just a -> Just a
= \x -> case x of
    Nothing -> x
    Just a  -> x
= \x -> case x of
    _ -> x
= \x -> x
= id

-- Second law
fmap f . fmap g = fmap (f . g)

-- Proof
fmap f . fmap g
= \x -> fmap f (fmap g x)
= \x -> fmap f (case x of
    Nothing -> Nothing
    Just a  -> Just (f a) )
= \x -> case x of
    Nothing -> fmap f  Nothing
    Just a  -> fmap f (Just (g a))
= \x -> case x of
    Nothing -> Nothing
    Just a  -> Just (f (g a))
= \x -> case x of
    Nothing -> Nothing
    Just a  -> Just ((f . g) a)
= \x -> case x of
    Nothing -> fmap (f . g) Nothing
    Just a  -> fmap (f . g) (Just a)
= \x -> fmap (f . g) (case x of
    Nothing -> Nothing
    Just a  -> Just a )
= \x -> fmap (f . g) (case x of
    Nothing -> x
    Just a  -> x )
= \x -> fmap (f . g) (case x of
    _ -> x )
= \x -> fmap (f . g) x
= fmap (f . g)

もちろん、これらのステップの多くをスキップすることもできましたが、完全な証明を詳しく説明したかっただけです。これらの種類の法則を証明することは、最初はコツをつかむまで難しいので、ゆっくりとペダンティックに始めることをお勧めします。その後、慣れてきたら、ステップを組み合わせて始め、しばらくして頭の中でいくつかのことを実行して、より単純なものにすることもできます。もの。

于 2012-06-17T15:40:59.900 に答える