Home > OS >  Haskell not recognizing the type
Haskell not recognizing the type

Time:03-18

I have this custom types

data Stack a = Empty | a :<| (Stack a)
             deriving (Show, Read, Eq)
type Value = Int
type ComputerStack = Stack.Stack (Either Address Value)

And when i want to do something like this

push :: a -> Stack a -> Stack a
push a b = a :<| b

runS :: Value -> ComputerStack -> Seq.Seq Value
runS value stack
  | value == 0  = stack
  | otherwise = runS 0 (Stack.push value stack)

I get this

    * Couldn't match type `Int' with `Either Address Value'
      Expected type: ComputerStack
        Actual type: Stack.Stack Value
    * In the second argument of `runS', namely
        `(Stack.push value stack)'
      In the expression: runS 0 (Stack.push value stack)
      In an equation for `runS':
          runS value stack
            | value == 0 = stack
            | otherwise = runS 0 (Stack.push value stack)
   |
37 |   | otherwise = runS 0 (Stack.push value stack)

My question is, why this is an error since computer stack can be Stack.Stack Value

CodePudding user response:

Your value is an Int, hence push can not push that on a Stack (Either Address Value)? It requires that the type of the item and the items of the stack are the same.

You can use Right to convert it to an Either a Value and push that on the stack, so:

runS :: Value -> ComputerStack -> ComputerStack
runS value stack
  | value == 0  = stack
  | otherwise = Stack.push (Right value) stack

An Either a b does not mean that it can be an a type or a b type. It is a type that has two type constructors Left and Right. An element of Either a b is thus a Left a or a Right b, but not a or b directly.

  • Related