【问题标题】:Defining functor for this stack type in haskell在haskell中为这种堆栈类型定义函子
【发布时间】:2012-09-12 13:52:02
【问题描述】:

这就是我定义堆栈类型的方式。可能有更好的方法,但现在让我们坚持这个。

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

但我无法为此定义函子。我的这次尝试失败了,说“Parse error in pattern: v”

instance Functor Stack' where
    fmap f (v l) = (map f v) (l)

有人可以帮我定义函子吗?

【问题讨论】:

    标签: haskell functor


    【解决方案1】:
    instance Functor Stack' where
        fmap f (Stack' v l) = Stack' (map f v) (l)
    

    查看fmap :: Functor f =&gt; (a -&gt; b) -&gt; f a -&gt; f b的类型,你会发现你的错误。

    您需要提供f a 类型的值(这里f 是Stack')并返回f a 类型的值。

    你也应该尽量避免++,因为它是O(n),其中n是第一个参数的长度。

    【讨论】:

    • 这里避免++length 的一种方法是将列表保持倒序并存储剩余容量而不是最大值。
    【解决方案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
    

    【讨论】:

    • 谢谢。我不知道你可以把我搬出去。
    猜你喜欢
    • 1970-01-01
    • 2013-02-25
    • 2011-01-06
    • 2020-06-06
    • 2011-03-01
    • 2016-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多