在haskell中为此堆栈类型定义仿函数

时间:2012-09-12 13:52:03

标签: haskell functor

这就是我定义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)

有人可以帮我定义仿函数吗?

2 个答案:

答案 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