
Hi, I have code like follow. And compiling gave me error as the last part. What should I do? ``` class WidgetClass w data Widget = forall a. WidgetClass a => Widget a instance WidgetClass Widget lookupWin :: (WidgetClass w) => WINDOW -> w -> Maybe w lookupWin xwin widget = if widgetWindowId widget == xwin then Just widget else foldl (\a (Widget b) -> maybe (lookupWin xwin b) Just a ) Nothing $ widgetChildren widget ``` --- ``` Graphics/HUI/Widget.hs:15:23: Could not deduce (w ~ a) from the context (WidgetClass w) bound by the type signature for lookupWin :: WidgetClass w => WINDOW -> w -> Maybe w at Graphics/HUI/Widget.hs:10:14-54 or from (WidgetClass a) bound by a pattern with constructor Widget :: forall a. WidgetClass a => a -> Widget, in a lambda abstraction at Graphics/HUI/Widget.hs:14:19-26 ‘w’ is a rigid type variable bound by the type signature for lookupWin :: WidgetClass w => WINDOW -> w -> Maybe w at Graphics/HUI/Widget.hs:10:14 ‘a’ is a rigid type variable bound by a pattern with constructor Widget :: forall a. WidgetClass a => a -> Widget, in a lambda abstraction at Graphics/HUI/Widget.hs:14:19 Expected type: Maybe w Actual type: Maybe a Relevant bindings include b :: a (bound at Graphics/HUI/Widget.hs:14:26) a :: Maybe w (bound at Graphics/HUI/Widget.hs:14:16) widget :: w (bound at Graphics/HUI/Widget.hs:11:16) lookupWin :: WINDOW -> w -> Maybe w (bound at Graphics/HUI/Widget.hs:11:1) In the first argument of ‘maybe’, namely ‘(lookupWin xwin b)’ In the expression: maybe (lookupWin xwin b) Just a ``` -- 竹密岂妨流水过 山高哪阻野云飞 And for G+, please use magiclouds#gmail.com.

Sorry, missed a line of `class WidgetClass w`. ``` class WidgetClass w where widgetChildren :: w -> [Widget] ``` On Tue, Jul 29, 2014 at 2:29 PM, Magicloud Magiclouds < magicloud.magiclouds@gmail.com> wrote:
Hi,
I have code like follow. And compiling gave me error as the last part. What should I do?
``` class WidgetClass w data Widget = forall a. WidgetClass a => Widget a instance WidgetClass Widget
lookupWin :: (WidgetClass w) => WINDOW -> w -> Maybe w lookupWin xwin widget = if widgetWindowId widget == xwin then Just widget else foldl (\a (Widget b) -> maybe (lookupWin xwin b) Just a ) Nothing $ widgetChildren widget ``` --- ``` Graphics/HUI/Widget.hs:15:23: Could not deduce (w ~ a) from the context (WidgetClass w) bound by the type signature for lookupWin :: WidgetClass w => WINDOW -> w -> Maybe w at Graphics/HUI/Widget.hs:10:14-54 or from (WidgetClass a) bound by a pattern with constructor Widget :: forall a. WidgetClass a => a -> Widget, in a lambda abstraction at Graphics/HUI/Widget.hs:14:19-26 ‘w’ is a rigid type variable bound by the type signature for lookupWin :: WidgetClass w => WINDOW -> w -> Maybe w at Graphics/HUI/Widget.hs:10:14 ‘a’ is a rigid type variable bound by a pattern with constructor Widget :: forall a. WidgetClass a => a -> Widget, in a lambda abstraction at Graphics/HUI/Widget.hs:14:19 Expected type: Maybe w Actual type: Maybe a Relevant bindings include b :: a (bound at Graphics/HUI/Widget.hs:14:26) a :: Maybe w (bound at Graphics/HUI/Widget.hs:14:16) widget :: w (bound at Graphics/HUI/Widget.hs:11:16) lookupWin :: WINDOW -> w -> Maybe w (bound at Graphics/HUI/Widget.hs:11:1) In the first argument of ‘maybe’, namely ‘(lookupWin xwin b)’ In the expression: maybe (lookupWin xwin b) Just a ``` -- 竹密岂妨流水过 山高哪阻野云飞
And for G+, please use magiclouds#gmail.com.
-- 竹密岂妨流水过 山高哪阻野云飞 And for G+, please use magiclouds#gmail.com.

I can see this is because of existential type used in Widget. But removing it would make a lot of other types using a type var for no reason. On Tue, Jul 29, 2014 at 2:31 PM, Magicloud Magiclouds < magicloud.magiclouds@gmail.com> wrote:
Sorry, missed a line of `class WidgetClass w`.
``` class WidgetClass w where widgetChildren :: w -> [Widget] ```
On Tue, Jul 29, 2014 at 2:29 PM, Magicloud Magiclouds < magicloud.magiclouds@gmail.com> wrote:
Hi,
I have code like follow. And compiling gave me error as the last part. What should I do?
``` class WidgetClass w data Widget = forall a. WidgetClass a => Widget a instance WidgetClass Widget
lookupWin :: (WidgetClass w) => WINDOW -> w -> Maybe w lookupWin xwin widget = if widgetWindowId widget == xwin then Just widget else foldl (\a (Widget b) -> maybe (lookupWin xwin b) Just a ) Nothing $ widgetChildren widget ``` --- ``` Graphics/HUI/Widget.hs:15:23: Could not deduce (w ~ a) from the context (WidgetClass w) bound by the type signature for lookupWin :: WidgetClass w => WINDOW -> w -> Maybe w at Graphics/HUI/Widget.hs:10:14-54 or from (WidgetClass a) bound by a pattern with constructor Widget :: forall a. WidgetClass a => a -> Widget, in a lambda abstraction at Graphics/HUI/Widget.hs:14:19-26 ‘w’ is a rigid type variable bound by the type signature for lookupWin :: WidgetClass w => WINDOW -> w -> Maybe w at Graphics/HUI/Widget.hs:10:14 ‘a’ is a rigid type variable bound by a pattern with constructor Widget :: forall a. WidgetClass a => a -> Widget, in a lambda abstraction at Graphics/HUI/Widget.hs:14:19 Expected type: Maybe w Actual type: Maybe a Relevant bindings include b :: a (bound at Graphics/HUI/Widget.hs:14:26) a :: Maybe w (bound at Graphics/HUI/Widget.hs:14:16) widget :: w (bound at Graphics/HUI/Widget.hs:11:16) lookupWin :: WINDOW -> w -> Maybe w (bound at Graphics/HUI/Widget.hs:11:1) In the first argument of ‘maybe’, namely ‘(lookupWin xwin b)’ In the expression: maybe (lookupWin xwin b) Just a ``` -- 竹密岂妨流水过 山高哪阻野云飞
And for G+, please use magiclouds#gmail.com.
-- 竹密岂妨流水过 山高哪阻野云飞
And for G+, please use magiclouds#gmail.com.
-- 竹密岂妨流水过 山高哪阻野云飞 And for G+, please use magiclouds#gmail.com.

I should just use Widget I defined. Why not before.... But then I am confused on type cast again. How to extract the existential type inside Widget? On Tue, Jul 29, 2014 at 3:04 PM, Magicloud Magiclouds < magicloud.magiclouds@gmail.com> wrote:
I can see this is because of existential type used in Widget. But removing it would make a lot of other types using a type var for no reason.
On Tue, Jul 29, 2014 at 2:31 PM, Magicloud Magiclouds < magicloud.magiclouds@gmail.com> wrote:
Sorry, missed a line of `class WidgetClass w`.
``` class WidgetClass w where widgetChildren :: w -> [Widget] ```
On Tue, Jul 29, 2014 at 2:29 PM, Magicloud Magiclouds < magicloud.magiclouds@gmail.com> wrote:
Hi,
I have code like follow. And compiling gave me error as the last part. What should I do?
``` class WidgetClass w data Widget = forall a. WidgetClass a => Widget a instance WidgetClass Widget
lookupWin :: (WidgetClass w) => WINDOW -> w -> Maybe w lookupWin xwin widget = if widgetWindowId widget == xwin then Just widget else foldl (\a (Widget b) -> maybe (lookupWin xwin b) Just a ) Nothing $ widgetChildren widget ``` --- ``` Graphics/HUI/Widget.hs:15:23: Could not deduce (w ~ a) from the context (WidgetClass w) bound by the type signature for lookupWin :: WidgetClass w => WINDOW -> w -> Maybe w at Graphics/HUI/Widget.hs:10:14-54 or from (WidgetClass a) bound by a pattern with constructor Widget :: forall a. WidgetClass a => a -> Widget, in a lambda abstraction at Graphics/HUI/Widget.hs:14:19-26 ‘w’ is a rigid type variable bound by the type signature for lookupWin :: WidgetClass w => WINDOW -> w -> Maybe w at Graphics/HUI/Widget.hs:10:14 ‘a’ is a rigid type variable bound by a pattern with constructor Widget :: forall a. WidgetClass a => a -> Widget, in a lambda abstraction at Graphics/HUI/Widget.hs:14:19 Expected type: Maybe w Actual type: Maybe a Relevant bindings include b :: a (bound at Graphics/HUI/Widget.hs:14:26) a :: Maybe w (bound at Graphics/HUI/Widget.hs:14:16) widget :: w (bound at Graphics/HUI/Widget.hs:11:16) lookupWin :: WINDOW -> w -> Maybe w (bound at Graphics/HUI/Widget.hs:11:1) In the first argument of ‘maybe’, namely ‘(lookupWin xwin b)’ In the expression: maybe (lookupWin xwin b) Just a ``` -- 竹密岂妨流水过 山高哪阻野云飞
And for G+, please use magiclouds#gmail.com.
-- 竹密岂妨流水过 山高哪阻野云飞
And for G+, please use magiclouds#gmail.com.
-- 竹密岂妨流水过 山高哪阻野云飞
And for G+, please use magiclouds#gmail.com.
-- 竹密岂妨流水过 山高哪阻野云飞 And for G+, please use magiclouds#gmail.com.
participants (2)
-
Albert Y. C. Lai
-
Magicloud Magiclouds