gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 07:19:10 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com