我有這個自定義型別
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)
我的問題是,為什么這是一個錯誤,因為計算機堆疊可以是 Stack.Stack 值
uj5u.com熱心網友回復:
你value是一個Int,因此push不能把它推上一個Stack (Either Address Value)?它要求專案的型別和堆疊的專案相同。
您可以使用Right將其轉換為 anEither a Value并將其推送到堆疊上,因此:
runS :: Value -> ComputerStack -> ComputerStack
runS value stack
| value == 0 = stack
| otherwise = Stack.push (Right value) stack
AnEither a b并不意味著它可以是a型別或b型別。它是一種具有兩個型別建構式Left和Right. 的元素Either a b因此是 aLeft a或 a Right b,但不是a或b直接。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/446004.html
標籤:哈斯克尔
