Haskell:实现应用列表

问题描述 投票:0回答:2

这是一个自我激励的练习。为了让

<*>
的最终情况起作用,我求助于将
concatenation
实现为辅助功能。我错过了一个把戏吗?也就是说,该案例是否可以在不需要辅助功能的情况下编写或以其他方式编写? (顺便说一句,我的主要参考资料是Haskell Wikibook,如果相关的话。)

代码:

    data List a = Empty | Item a (List a)
        deriving (Eq, Ord, Show, Read)

    instance Functor List where
        fmap ab Empty       = Empty
        fmap ab (Item a la) = Item (ab a) (fmap ab la)

    instance Applicative List where
        pure a                    = Item a Empty
        Empty       <*> _         = Empty
        _           <*> Empty     = Empty
        Item ab lab <*> Item a la = -- this is the case in question
            Item (ab a) (concatenation (ab <$> la) (lab <*> Item a la))

我想归根结底是,据我有限的经验,我不需要辅助功能来实现任何类型的实例,所以在这里使用一个让我想知道是否有必要......

haskell applicative
2个回答
0
投票

没有理由避免辅助功能。无论您如何定义实例,它要么需要使用

concatenation
,要么重新实现其部分或全部定义。


0
投票

这是 List 应用实例的一个较短的等效版本。

instance Applicative List where
    pure a             = Item a Empty
    Empty       <*> _  = Empty
    Item ab lab <*> la = concatenation (ab <$> la) (lab <*> la)
© www.soinside.com 2019 - 2024. All rights reserved.