【发布时间】:2016-04-14 15:15:36
【问题描述】:
假设我想使用模式匹配实现列表的长度函数,那么我可以这样做:
length' :: (Num b) => [a] -> b
length' [] = 0
length' (_:xs) = 1 + length' xs
我可以用Vectors 做类似的事情吗?
【问题讨论】:
-
您可以使用
ViewPatterns和PatternSynonyms之类的东西对抽象类型的东西进行模式匹配,但是如果您想在Vector上编写类似length的归纳函数,为什么不只是使用foldl或foldr,或vector提供的其他十几个“折叠”变体中的任何一个?如果您使用例如,这具有推广到每个Foldable的优势。Data.Foldable.foldr而不是vector中的特定版本。 -
也许
case splitAt 1 v of ...?如上所述,可能制作成ViewPattern。 -
注意模式同义词;如果设计不当,它们可能会破坏性能直觉。
-
经验法则:在模式同义词上应用或匹配应该分摊 O(1) 时间,即使该值被持久使用。我永远不会容忍比多对数时间更糟糕的模式同义词。
标签: haskell pattern-matching pattern-synonyms