2016-03-24 3 views
1

Le code disponible à partir github:exemple manquant de MonadReader

{-# LANGUAGE TypeFamilies 
      , TypeOperators #-} 

module Test where 

import Control.Monad.Reader 

import Control.Lens 
import Control.Zipper 

class Monad f => Family f where 
    type Set f 

-- This does not work 
f :: Family f => (Top :>> [Set f] :>> Set f) -> f (Set f) 
f = return . view focus 

-- This here works 
g :: Top :>> [Int] :>> Int -> Int 
g = view focus 

compile très bien avec ghc-8 mais ne parvient pas à compiler avec ghc-7.10 avec l'erreur

Test.hs:16:14: 
Could not deduce (MonadReader 
        (Zipper (Top :>> [Set f]) Int (Set f)) 
        ((->) ((Top :>> [Set f]) :>> Set f))) 
    arising from a use of `view' 
from the context (Family f) 
    bound by the type signature for 
      f :: Family f => (Top :>> [Set f]) :>> Set f -> f (Set f) 
    at Test.hs:15:6-57 
In the second argument of `(.)', namely `view focus' 
In the expression: return . view focus 
In an equation for `f': f = return . view focus 

dans les deux cas exactement les mêmes dépendances sont utilisées (mtl 2.2.1, transformers 0.5.2, lens 4.14, zippers 0.2) sauf base qui ne peut être que 4.8 pour ghc-7.10 et 4.9 pour ghc-8. Je ne peux vraiment pas comprendre pourquoi il devrait compiler avec un compilateur et pas l'autre. Je voudrais aussi que le code fonctionne pour ghc-7.10.

+0

Je ne peux pas reproduire ceci: ': t les cadres (undefined :: Conf m) & view focus' sont correctement résolus pour' Set m' dans ghci. – zakyggaps

+0

J'ai simplifié le problème et déplacé l'exemple à https://github.com/jakubdaniel/test. – jakubdaniel

Répondre

0

Je ne sais toujours pas pourquoi ce problème se pose. Mais avec l'aide aimable d'un utilisateur puregreen sur #haskell canal irc j'ai été en mesure de surmonter ce problème dans ce réglage en remplaçant simplement view focus avec (^. focus).