如何在模式匹配函数中使用三角运算符



我正试图使用序列来提高性能。当定义下面的函数时,我尝试在模式修补上下文中使用"三角形"操作符。

import qualified Data.Sequence as S
cleanField :: S.Seq Char -> S.Seq Char
cleanField ((S.<|)  ' '  xs) = cleanField xs
cleanField ((S.|>)  xs  ' ') = cleanField xs
cleanField  xs = xs

GHC 7.4.1说:

seq.hs:4:13: Parse error in pattern: (S.<|)

我可以不使用三角运算符(<|, |>)在模式匹配?

如果是这样,为什么我可以在模式匹配中使用cons (:)操作符而不是三角形操作符?

Xavier Pinho说得对。操作符(<|)(|>)是普通函数,但模式中只能使用数据构造函数。(是的,它们在文档标题Construction下列出,因为它们用于从组件中构造序列,但它们在技术上不是数据构造器。)

标准库提供了viewlviewr两个函数来创建数据类型为ViewLViewR的成员。它们有可以匹配的构造函数:<:>

一个例子:

s :: Seq Int
s = fromList [1,2,3]
test1 :: (Int, Seq Int)
test1 = case viewl s of
          x :< xs -> (x, xs)
test2 :: (Seq Int, Int)
test2 = case viewr s of
          xs :> x -> (xs, x)

这些视图也可以方便地与ViewPatterns语言扩展一起使用。如果启用,您可以输入

test3 :: Seq Int -> (Int, Seq Int)
test3 (viewl -> x :< xs) = (x, xs)

只能在构造函数上进行模式匹配,Haskell中的中缀构造函数必须以冒号开头。所以这些三角运算符都是普通函数,:是一个链表构造函数。

检查Sequence的一端,可以使用viewlviewr函数。它们分别返回ViewLViewR,并且这些类型也有类似三角形的操作符作为构造函数。您可以像下面这样将它们与模式保护符一起使用。

cleanField xs
  | ' '  S.:< rest <- S.viewl xs = cleanField rest
  | rest S.:> ' '  <- S.viewr xs = cleanField rest
  | otherwise                    = xs

相关内容

  • 没有找到相关文章

最新更新