我有这个自定义类型
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)
我的问题是,为什么这是一个错误,因为计算机堆栈可以是堆栈。堆栈值
您的value
是Int
,因此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
类型。它是一个具有两个类型构造函数Left
和Right
的类型。因此,Either a b
的元素是Left a
或Right b
,而不是直接的a
或b
。