ユーザーsingpolyma "asked on reddit基礎となるいくつかの一般的な構造があった場合:アプリケーション・ファンクタの構成によって、短絡故障の成功リストをモデル化できますか?
data FailList a e = Done | Next a (FailList a e) | Fail e
無料モナドが示唆されたが、これは応用的ファンクタを経由して、より一般的にモデル化することができれば、私は疑問に思いました。 Abstracting with Applicativesでは、Bazermanは、2つのアプリケーションファンクタの合計が、バイアスの方向に自然な変換を持っていれば、左右に偏りを持った応用ファンクタであることを示しています。これは私たちが必要とするように聞こえる!したがって、私は提案を始めましたが、すぐに問題に直面しました。誰でもこれらの問題の解決策を見てもらえますか?:
最初に、2つのファンクタの合計の定義から始めます。ここでは、成功型か成功型か失敗型の合計型をモデル化したいので、ここから始めました。
data Sum f g a = InL (f a) | InR (g a)
そして、我々が仕事をしたい2ファンクタは次のとおりです。
data Success a = Success [a]
data Failure e a = Failure e [a]
Success
はまっすぐである - それは、基本的にConst [a]
です。しかし、Failure e
私はそれについてはあまりよく分かりません。 pure
には定義がないため、これは応用関数ではありません。しかしながら、Applyのインスタンスである:
instance Functor Success where
fmap f (Success a) = Success a
instance Functor (Failure e) where
fmap f (Failure e a) = Failure e a
instance Apply (Failure e) where
(Failure e a) <.> (Failure _ b) = Failure e a
instance Apply Success where
(Success a) <.> (Success b) = Success (a <> b)
instance Applicative Success where
pure = const (Success [])
a <*> b = a <.> b
次に、我々は(そう左バイアス)を右から左への自然変換して、これらのファンクタの和を定義することができる:
instance (Apply f, Apply g, Applicative g, Natural g f) => Applicative (Sum f g) where
pure x = InR $ pure x
(InL f) <*> (InL x) = InL (f <*> x)
(InR g) <*> (InR y) = InR (g <*> y)
(InL f) <*> (InR x) = InL (f <.> eta x)
(InR g) <*> (InL x) = InL (eta g <.> x)
そして今私たちがしなければならないのは、私たちの自然な変容を定義することだけです。そして、これはすべてが崩れ落ちるところです。
instance Natural Success (Failure e) where
eta (Success a) = Failure ???? a
Failure
を作成することができないことが問題になります。さらに、の場合には、はと評価されるため、ハッキーで⊥を使用することもできません。
私は何かが欠けているように感じますが、それは何か分かりません。
これはできますか?
nallality条件 'forall(f :: a - > b)です。 η fmap f == fmap f。 ηは、誤差成分が一定でなければならないことを強く示唆している。それで、私は 'Default e => Applicative(Failure e)'を書いています。 –
また、あなたの 'Apply' /' Applicative'インスタンスは変です。ヘッドを固定してチェックするように修正しましたが、一般的にタイプチェックもしていません! 'Success a'は' Constant [a] 'と同型ではありませんが...少なくとも、より多くの型指数が必要です! –
@tel - 'Default'が可能であると思われますが、私はまともな"デフォルトエラーメッセージ "が何であるか分かりません。また、あなたの編集内容は他のSO編集者によって拒否されましたが、有効です。私は自分でそれを適用します。 – ocharles