我正在尝试在haskell中对deque进行一些模式匹配,但是有一些问题。
以下是我正在尝试做的一些解释。
我正在尝试从Refal到Haskell实现编译器。 Refal是一种使用模式匹配的语言。所以典型的refal函数如下所示:
RefalFunc {
e.1 s.1 (e.2) 's' t.1 t.2 t.1 e.2 = e.1 e.2
e.1 ' ' e.2 = 'foo' e.1 'foo' e.2
e.1 = 'anyexpression'
}
所以这个函数采用refal-expression(由术语组成)并尝试将其与3个模式中的1个匹配,如果成功,则根据右侧的规则将refal-expression转换为另一个。
e.1,e.2 .. - 表示一些refal表达式 t.1 t.2 - 表示某些术语,例如“(e.1 t.2 e.2)”是一个术语,“e.1 t.2 e.2”不是 s.A s.1 - 表示符号 's' - 意味着象征''。还有一些其他类型的符号,但没关系。
在我的编译器中,refal-expressions表示为deques,因此对于每个refal函数,我需要根据某种模式生成一个函数,该函数需要一些deque并对其进行转换。 所以我有类似的东西
myFunc1:: Deque -> Deque
myFunc1 deq = if matchPattern1 deq then doSomeWork1
else if matchPattern2 deq then doSomeWork2
...
where matchPattern1 = ...
matchPattern2 = ...
....
所以,主要的问题是,我真的不知道如何做matchTattern函数。
所以,对于给定的deque,我可以很容易地找到第一个(或最后一个)术语或符号,但是当我遇到e.1时,我不知道该怎么做,这意味着部分双端队列具有未知大小。
所以这是一个例子。 Deque:(5 + 6)* 7 *(5 +(4 + 1))*(5 + 6)*(5 + 6)//这里的每个符号都是deque的一个元素,每个非Bracket符号都是术语,每个(/ 一些符号 /)都是一个术语
我需要检查这个deque是否与以下模式匹配(并找到合适的分区)
pattern1: t.1 e.1 t.1
pattern2: t.1 '*' e.1 (t.2 e.2) s.1 t.1 e.3
回答pattern1:
t.1 = ( 5 + 6 )
e.1 = * 7 * ( 5 + ( 4 + 1 ) ) * ( 5 + 6 ) *
回答pattern2:
t.1 = ( 5 + 6 )
e.1 = 7 *
t.2 = 5
s.1 = *
e.2 = + ( 4 + 1 )
e.3 = * ( 5 + 6 )
我正在使用Okasaki CatenableDeque的实现。