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 8875951
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: June 14, 20262026-06-14T19:06:16+00:00 2026-06-14T19:06:16+00:00

I would like to put the 2 functions ( color and check ) into

  • 0

I would like to put the 2 functions (color and check) into the most general form
Eq a => ....
But I don’t know how to do that.

This is a very simple graph: each node has 2 neighbours, and any adjacent nodes must have different colors

color ::  [(Int, Int)] -> [(Int, Int)] -> Bool
color x [] = True
color a ((x,y):rest) =
    if check a x == check a y
    then False
    else color a rest

check :: [(Int, Int)] -> Int -> Int
check [] x = 999
check ((x,y):rest) p =
    if x == p
    then y
    else check rest p

At the end, colors gives you True or False

Main> colors [('a',"purple"),('b',"green"),('c',"blue")] [('a','b'),('b','c'),('c','a')]
True

Main> colors [('a',"purple"),('b',"green"),('c',"purple")] [('a','b'),('b','c'),('c','a')]
False

Main> colors [('1',"purple"),('2',"green"),('3',"blue")] [('1','2'),('2','3'),('3','1')]
True

Main> colors [('1',"4"),('2',"5"),('3',"6")] [('1','2'),('2','3'),('3','1')]
True

Main> colors [('1',"4"),('2',"4"),('3',"5")] [('1','2'),('2','3'),('3','1')]
False

Any help is welcome (+ if you can fix x = 999 into False).

  • 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-14T19:06:16+00:00Added an answer on June 14, 2026 at 7:06 pm

    For starters, the reason you can’t generalize the Int to an Eq a is because of the 999 hard-coded in check. If you just leave some random value in there, you must know its type, so you cannot generalize the function beyond that (well, in this particular case, you can generalize to Eq a, Num a, but not more).

    So, the answer is to not use some arbitrary value, but instead wrap the return of check into a type that has a “failure” case, namely Maybe.

    Renaming the variables to follow Haskell conventions, and giving the functions a bit more elucidating names, we get:

    canColor ::  Eq a => [(a, a)] -> [(a, a)] -> Bool
    canColor _ [] = True
    canColor xs ((x,y):rest) =
        if findNeighbour xs x == findNeighbour xs y
        then False
        else canColor xs rest
    
    findNeighbour :: Eq a => [(a, a)] -> a -> Maybe a
    findNeighbour [] _ = Nothing
    findNeighbour ((x,y):rest) z =
        if x == z
        then Just y
        else findNeighbour rest z
    

    The idea here is that findNeighbour returns Nothing if it can’t find anything, or Just 23 if it finds 23 (or whatever it finds).

    As it happens, findNeighbour is already defined: it’s called lookup. So, you could rewrite your code as:

    canColor ::  Eq a => [(a, a)] -> [(a, a)] -> Bool
    canColor _ [] = True
    canColor xs ((x,y):rest) =
        if lookup x xs == lookup y xs
        then False
        else canColor xs rest
    

    Now, we note that you are basically checking a predicate against all items in a list. There’s a function for this: all. So, we can shorten the code to:

    canColor ::  Eq a => [(a, a)] -> Bool
    canColor xs = all (\(x, y) -> lookup x xs /= lookup y xs) xs
    
    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I would like to put into Bundle for example Path object. I know, that
Imagine a user that would like to put a form on their website that
I have a watermark that I would like to put into my pdf. The
I have about 30 different flagged enums that I would like to put into
I would like to put a placeholder into e.g. the footer.html and have it
I would like to put jQuery at the bottom of the body tag but
I have a chart that I would like to update whenever a form on
I would like to put data from table into highcharts piechart. The table will
Would like to put any js functions in application.js or other .js file. However,
I would like to put newlines in a property value of a manifest. Its

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.