次のコードでは、GHCはMonoidal
インスタンスの定義でFunctorインスタンスを見つけることができません。スーパークラスを推論できません
GHCががApplicative
制約が満たされるを与えられたことを推測されていないのはなぜ、その後、Functor
はすでにどこかにあることをを持っていますか?
import Prelude hiding (Applicative (..), Monad (..))
class Functor f => Applicative f where
pure :: a -> f a
(<*>) :: f (a -> b) -> f a -> f b
class Functor f => Monoidal f where
unit::f()
(*) ::f a -> f b -> f (a,b)
instance Applicative f => Monoidal f where
unit = pure()
a * b = undefined
私はもちろんのエラーを持っていないためにMonoidal
に明示的なFunctor f
制約を追加することができます知っているが、私の質問は、インスタンスの解像度がそのように動作する理由の詳細である(この推論「機能」?に名前があります)
import Prelude hiding ((*), Applicative (..), Monad (..))
class Functor f => Applicative f where
pure :: a -> f a
(<*>) :: f (a -> b) -> f a -> f b
class Functor f => Monoidal f where
unit::f()
(*) ::f a -> f b -> f (a,b)
instance (Applicative f, Functor f) => Monoidal f where
unit = pure()
a * b = (pure (,) <*> a <*> b)
instance (Monoidal f, Functor f) => Applicative f where
pure x = fmap (\_ -> x) unit
mu <*> mx = fmap (\(f, x) -> f x) ((mu * mx) :: f (a -> b, a))
このようなインスタンスが多くの意味をなさないことは明らかです。 - でも、良い質問ですが、私はこれを許可し、スーパークラスを見つけるためにコンパイラを想定しています。 – leftaroundabout
私が見ている根本的な問題は、 "Functor f => Monoidal f"と "Applicative f => Monoidal f"の両方があることです。私が理解しているように、コンパイラは、特定の型の特定の型クラスに対して1つの可能な派生パスしか見る必要がありません。 – NovaDenizen
@回り道についてこれは同形だから前後に何を意味するのでしょうか?だから、私はisoを敷き詰めてそのことを思い出しているのです – nicolas