From fea361cfbb6d1409d31f612a816030216c05b516 Mon Sep 17 00:00:00 2001 From: Martijn van Steenbergen Date: Wed, 30 Nov 2011 00:35:43 +0100 Subject: [PATCH 1/2] Explicit type signature for `c` in function `derive`. Fixes https://github.com/sebastiaanvisser/fclabels/issues/4 --- src/Data/Label/Derive.hs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Data/Label/Derive.hs b/src/Data/Label/Derive.hs index 8330d55..7a12644 100644 --- a/src/Data/Label/Derive.hs +++ b/src/Data/Label/Derive.hs @@ -5,6 +5,7 @@ , FlexibleContexts , FlexibleInstances , TypeOperators + , RankNTypes #-} module Data.Label.Derive ( mkLabels @@ -101,7 +102,7 @@ derive signatures concrete tyname vars total ((field, _, fieldtyp), ctors) = where mono = forallT prettyVars (return []) [t| $(inputType) :~> $(return prettyFieldtyp) |] poly = forallT forallVars (return []) [t| (ArrowChoice $(arrow), ArrowZero $(arrow)) => Lens $(arrow) $(inputType) $(return prettyFieldtyp) |] - body = [| let c = zeroArrow ||| returnA in lens (c . $(getter)) (c . $(setter)) |] + body = [| let c :: forall b d (~>). Either b d ~> d; c = zeroArrow ||| returnA in lens (c . $(getter)) (c . $(setter)) |] where getter = [| arr (\ p -> $(caseE [|p|] (cases (bodyG [|p|] ) ++ wild))) |] setter = [| arr (\(v, p) -> $(caseE [|p|] (cases (bodyS [|p|] [|v|]) ++ wild))) |] From 5533d3bcfa754560080624bfe3b0ca605b5448dc Mon Sep 17 00:00:00 2001 From: Martijn van Steenbergen Date: Wed, 30 Nov 2011 00:44:44 +0100 Subject: [PATCH 2/2] Fix for more complicated cases --- src/Data/Label/Derive.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Data/Label/Derive.hs b/src/Data/Label/Derive.hs index 7a12644..145e408 100644 --- a/src/Data/Label/Derive.hs +++ b/src/Data/Label/Derive.hs @@ -102,7 +102,7 @@ derive signatures concrete tyname vars total ((field, _, fieldtyp), ctors) = where mono = forallT prettyVars (return []) [t| $(inputType) :~> $(return prettyFieldtyp) |] poly = forallT forallVars (return []) [t| (ArrowChoice $(arrow), ArrowZero $(arrow)) => Lens $(arrow) $(inputType) $(return prettyFieldtyp) |] - body = [| let c :: forall b d (~>). Either b d ~> d; c = zeroArrow ||| returnA in lens (c . $(getter)) (c . $(setter)) |] + body = [| let c :: forall b d (~>). (ArrowChoice (~>), ArrowZero (~>)) => Either b d ~> d; c = zeroArrow ||| returnA in lens (c . $(getter)) (c . $(setter)) |] where getter = [| arr (\ p -> $(caseE [|p|] (cases (bodyG [|p|] ) ++ wild))) |] setter = [| arr (\(v, p) -> $(caseE [|p|] (cases (bodyS [|p|] [|v|]) ++ wild))) |]