Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 8168145
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: June 6, 20262026-06-06T20:25:18+00:00 2026-06-06T20:25:18+00:00

I would like to state that the associated data is always an instance of

  • 0

I would like to state that the associated data is always an instance of a certain class.

class (Context (Associated a b)) => Class a where
  data Associated a :: * -> *

instance Context (Associated a b) where
  func1 = error "func1"

However, the free variable b that is not in scope prevents me from this. One of the solutions is to copy class functions from Context, but it looks ugly.

class Class a where
  data Associated a :: * -> *
  -- duplicate all functions from class Context
  contextFunc1 :: Associated a b -> String

instance Class a => Context (Associated a b) where
  func1 = contextFunc1

Is there an idiomatic way to put constraints on associated data type which has variables not mentioned in head?

edit: I would like to keep compatibility with GHC 7.0.3

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-06-06T20:25:20+00:00Added an answer on June 6, 2026 at 8:25 pm

    I don’t have GHC 7.0.3 available, but I think this should work with it.

    You could pass the dictionaries around manually like this (using Context = Show as an example):

    {-# LANGUAGE ScopedTypeVariables, TypeFamilies, ExistentialQuantification #-}
    
    data ShowDict a = Show a => ShowDict
    
    class Class a where
      data Associated a :: * -> *
    
      getShow :: ShowDict (Associated a b)
    
    -- Convenience function
    getShowFor :: Class a => Associated a b -> ShowDict (Associated a b)
    getShowFor _ = getShow
    
    showAssociated :: Class a => Associated a b -> String
    showAssociated a = 
      case getShowFor a of
        ShowDict -> -- Show (Associated a b) is made available by this pattern match 
          show a
    
    instance Class Int where
      data Associated Int b = Foo deriving Show
    
      getShow = ShowDict
    
    main = print $ showAssociated Foo
    

    This is somewhat similar to the function copying you propose, but advantages are:

    • Avoids repetition (of `Context`’s method signatures)
    • Having `Show Baz` in context is somewhat more powerful than just having a function for showing a `Baz`, since it allows you to call (library) functions which require `Show Baz`, or use implied instances like `Show [Baz]`:
    showAssociateds :: forall a b. Class a => [Associated a b] -> String
    showAssociateds as = 
      case getShow :: ShowDict (Associated a b) of
        ShowDict ->
          show as
    

    The main disadvantage is that using getShow always requires an explicit type signature (functions like getShowFor can mitigate this).

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I would like to save and restore the state of a WinForms Form ,
I would like to write a (HTML) parser based on state machine but I
I have a small JSF app and would like to keep some state on
Would like a for loop in jquery so that: For every hover_link: show hidden
Straightforward question: I have a few variables that are doubles. I would like to
I have a QT class instance, called C, (C inherits QOBJECT) that sends a
I would like to know about static (class) field representation within PHP interpreter. For
I have a dataset that looks something like this: IDnum State Product Consumption 123
I have an entity that has a state table associated with it. The state
I have a feature in my product that I would like to be installed

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.