这就是我定义Stack类型的方法。可能有更好的方法,但是现在让我们坚持这个。
data Stack' v = Stack' [v] Int deriving (Show)
所以像push这样的东西会是这样的
push' :: (Ord v) => Stack' v -> v -> Stack' v
push' (Stack' l m) a = if m <= length l then Stack' l m else Stack' (l ++ [a]) m
但我无法为此定义仿函数。我的这个尝试没有说“模式中的解析错误:v”
instance Functor Stack' where
fmap f (v l) = (map f v) (l)
有人可以帮我定义仿函数吗?
答案 0 :(得分:3)
instance Functor Stack' where
fmap f (Stack' v l) = Stack' (map f v) (l)
查看fmap :: Functor f => (a -> b) -> f a -> f b
的类型,您会发现错误。
您需要提供类型为f a
的值(此处为f为Stack'),并且还返回类型为f a
的值。
此外,您应该尝试避免++
,因为它是O(n)
,其中n是第一个参数的长度。
答案 1 :(得分:2)
最简单的定义是:
{-# LANGUAGE DeriveFunctor #-}
data Stack' v = Stack' [v] Int deriving (Show, Functor)
您应该避免使用length
,因为它是O(n)
。
使用a : l
代替l ++ [a]
- 列表只能有效地附加在他们的头部,尾部追加O(n)
。
您可以通过移动push'
内部来重写您的if
:
push' (Stack' l m) a = Stack' (if m <= length l then l else l ++ [a]) m