2016-03-24 12 views
1

Der Code erhältlich von github:Fehlende Instanz 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 

kompiliert mit ghc-8 in Ordnung, aber nicht mit ghc-7.10 mit dem Fehler

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 

in beiden Fällen genau die gleichen Abhängigkeiten verwendet werden, kompilieren (mtl 2.2.1, transformers 0.5.2, lens 4.14, zippers 0.2), ausgenommen base, die nur 4.8 fürsein könnenund 4.9 für ghc-8. Ich kann wirklich nicht herausfinden, warum es mit einem Compiler kompilieren sollte und nicht mit dem anderen. Ich möchte den Code auch für ghc-7.10 arbeiten lassen.

+0

Ich kann das nicht reproduzieren: ': t Frames (undefined :: Conf m) & view focus' ist richtig aufgelöst in' Set m' in ghci. – zakyggaps

+0

Ich habe das Problem vereinfacht und das Beispiel nach https://github.com/jakubdaniel/test verschoben. – jakubdaniel

Antwort

0

Ich weiß immer noch nicht, warum dieses Problem auftritt. Aber mit der freundlichen Hilfe eines Benutzers puregreen über auf #haskell IRC-Kanal konnte ich dieses Problem in dieser Einstellung zu überwinden, indem Sie einfach view focus durch (^. focus) ersetzen.