这是一个自我激励的练习。为了让
<*>
的最终情况起作用,我求助于将 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))
我想归根结底是,据我有限的经验,我不需要辅助功能来实现任何类型的实例,所以在这里使用一个让我想知道是否有必要......
没有理由避免辅助功能。无论您如何定义实例,它要么需要使用
concatenation
,要么重新实现其部分或全部定义。
这是 List 应用实例的一个较短的等效版本。
instance Applicative List where
pure a = Item a Empty
Empty <*> _ = Empty
Item ab lab <*> la = concatenation (ab <$> la) (lab <*> la)