Home > database >  Trying to search for an element in a listed tuple that has a new datatype
Trying to search for an element in a listed tuple that has a new datatype

Time:11-26

I've created a new datatype Board:

data Board a = Grid [(Position, Maybe a)]
    deriving (Eq, Show)

where Position is its own datatype:

data Position = NW | N | NE | W | M | E | SW | S | SE
    deriving (Eq, Ord, Show)

Now I'm trying to create a function label, that takes a Position and Board and returns the label at the given position (wrapped using Just) or Nothing if the given position is empty.

I was thinking of implementing a new function Search to do this.

search :: (Eq a) => a -> [(a,b)] -> Maybe b
search _ [] = Nothing
search x ((a,b):xs) = if x == a then Just b else search x xs

But I don't know how to pass in the List [(a,b)] from my Board input. I tried:

label :: Position -> Board a -> Maybe a
label p b = Search p b

and got the error:

    * Couldn't match expected type: [(Position, a)]
                  with actual type: Board a
    * In the second argument of `lookup', namely `b'
      In the expression: lookup p b
      In an equation for `label': label p b = lookup p b
    * Relevant bindings include
        b :: Board a (bound at A6.hs:21:9)
        label :: Position -> Board a -> Maybe a (bound at A6.hs:21:1)

Perhaps there's an easier way to go about this, but this is the only way I could think of.

(Aplet123 pointed out a mistake, since updated and updated the error produced)

CodePudding user response:

You need to look into your data type under the wraps to find the actual datum there,

label :: Position -> Board a -> Maybe a
label p (Grid b) = search p b
--       ^^^^

Function names in Haskell must not be capitalized. That is reserved for types and data constructors.

The above will give you another type error but you'll be able to tweak it, I believe, to get it fixed. For starters, enter the definition without the type signature, to see what type is inferred for it.

  • Related