我正在尝试使用序列来提高性能。在定义下面的函数时,我尝试在模式修补上下文中使用“三角形”运算符。
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 (
:
) 运算符而不是三角形运算符?
最佳答案
泽维尔·皮尼奥是对的。运营商(<|)
和 (|>)
是普通函数,但在模式中只能使用数据构造函数。 (是的,它们列在标题为构建的文档中,因为它们用于从组件构建序列,但从技术上讲,它们不是数据构造函数。)
该库提供两个函数 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
View 也很方便语言扩展。如果启用,你可以说test3 :: Seq Int -> (Int, Seq Int)
test3 (viewl -> x :< xs) = (x, xs)
匹配传入的序列,就像它是一个列表一样。
关于haskell - 如何在模式匹配函数中使用三角运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22582485/