我正试图使用序列来提高性能。当定义下面的函数时,我尝试在模式修补上下文中使用"三角形"操作符。
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下列出,因为它们用于从组件中构造序列,但它们在技术上不是数据构造器。)
标准库提供了viewl
和viewr
两个函数来创建数据类型为ViewL
和ViewR
的成员。它们有可以匹配的构造函数:<
和:>
一个例子:
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
的一端,可以使用viewl
和viewr
函数。它们分别返回ViewL
和ViewR
,并且这些类型也有类似三角形的操作符作为构造函数。您可以像下面这样将它们与模式保护符一起使用。
cleanField xs
| ' ' S.:< rest <- S.viewl xs = cleanField rest
| rest S.:> ' ' <- S.viewr xs = cleanField rest
| otherwise = xs