2017-11-03 11 views
7

次のコードでは、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)) 
+2

このようなインスタンスが多くの意味をなさないことは明らかです。 - でも、良い質問ですが、私はこれを許可し、スーパークラスを見つけるためにコンパイラを想定しています。 – leftaroundabout

+0

私が見ている根本的な問題は、 "Functor f => Monoidal f"と "Applicative f => Monoidal f"の両方があることです。私が理解しているように、コンパイラは、特定の型の特定の型クラスに対して1つの可能な派生パスしか見る必要がありません。 – NovaDenizen

+0

@回り道についてこれは同形だから前後に何を意味するのでしょうか?だから、私はisoを敷き詰めてそのことを思い出しているのです – nicolas

答えて

3

私にバグのようです。ここに問題を示す最小限のファイルがありますが、Preludeのものやundefinedの名前を変更しても何の意味もありません。

{-# LANGUAGE FlexibleInstances #-} 
{-# LANGUAGE UndecidableInstances #-} 
class A x 
class A x => B x 
class A x => C x 
instance B x => C x 

このファイル(またはそのようなもの)を使用してGHCバグトラッカーにバグを提出することをお勧めします。 B xA xを意味することを発見するために必要な推論が可能であるべきである。

+1

私はこれを[Trac#14417](https://ghc.haskell.org/trac/ghc/ticket/14417)として報告しました – dfeuer

+0

それが判明しました8.0の時点で、公式に期待されている動作であることが知られている。奇妙な。 – dfeuer

+2

[このコメント](https://ghc.haskell.org/trac/ghc/ticket/11427#comment:4)は、この行動によって解決される問題を説明するお金のように見えます。しかし、かなり技術的です。 –

関連する問題