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

标签 haskell pattern-matching sequence parse-error

我正在尝试使用序列来提高性能。在定义下面的函数时,我尝试在模式修补上下文中使用“三角形”运算符。

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 ( : ) 运算符而不是三角形运算符?

最佳答案

泽维尔·皮尼奥是对的。运营商(<|)(|>)是普通函数,但在模式中只能使用数据构造函数。 (是的,它们列在标题为构建的文档中,因为它们用于从组件构建序列,但从技术上讲,它们不是数据构造函数。)

该库提供两个函数 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 View 也很方便语言扩展。如果启用,你可以说
test3 :: Seq Int -> (Int, Seq Int)
test3 (viewl -> x :< xs) = (x, xs)

匹配传入的序列,就像它是一个列表一样。

关于haskell - 如何在模式匹配函数中使用三角运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22582485/

相关文章:

Haskell:GHC 无法推断类型。由类型签名错误绑定(bind)的刚性类型变量

generics - scala 类型匹配

regex - RegEx模式可在这些情况下限制破折号

r - 创建一系列等距的对

haskell - 'concat' : transforming a flattened list into a nested list 的逆

haskell - 当提供多个互斥选项时,如何使用 optparse-applicative 提供特定的错误消息?

if-statement - `if let` 只是编写其他 `if` 语句的另一种方式吗?

F# Seq.choose() 错误 FS0001

algorithm - 描述我的算法

list - Haskell,à la LYAH中差异列表上的头部和尾部