Haskell无法识别类型



我有这个自定义类型

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

当我想做类似的事情时

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)

我得到这个

* 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)

我的问题是,为什么这是一个错误,因为计算机堆栈可以是堆栈。堆栈值

您的valueInt,因此push不能将其推送到Stack (Either Address Value)上?它要求项的类型和堆栈中的项相同。

您可以使用Right将其转换为Either a Value并将其推送到堆栈上,因此:

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

Either a b并不意味着它可以是a类型或b类型。它是一个具有两个类型构造函数LeftRight的类型。因此,Either a b的元素是Left aRight b,而不是直接的ab

最新更新