【发布时间】:2020-07-30 11:59:40
【问题描述】:
我写了一个简单的类型:Stack 和一个类类型Stacked,带有两个操作“加号”和“减号”的实例。它已编译但运行时会产生标题上的错误。
代码是:
newtype Stack a = Stack a deriving (Show)
class Stacked a where
(/+/) :: a -> Stack [a] -> Stack [a]
(/-/) :: Stack [a] -> Stack [a]
instance Stacked (Stack a) where
(/+/) x (Stack xs) = Stack (x:xs)
(/-/) (Stack xs) = Stack (tail xs)
我尝试在实例中使用 (Stacked a) => ...,但没有结果。 我做错了什么?
附言。我知道我必须检查 [] 但在这种情况下,恕我直言并不重要
【问题讨论】:
-
(/+/)的类型签名是(/+/) :: a -> Stack [a] -> Stack [a],因此对于您的实例Stacked Stack a,这意味着(/+/)的类型为Stack a -> Stack [Stack a] -> Stack [Stack a]。你可能想用(/+/) :: a -> s a -> s a来创建一个class Stacked s类。
标签: class haskell instance newtype