标签: pattern-matching

Scala的模式匹配是否违反了开放/封闭原则?

如果我添加一个新的案例类,这是否意味着我需要搜索所有模式匹配代码并找出新类需要处理的位置?我最近一直在学习这门语言,当我读到一些支持和反对模式匹配的论据时,我一直很困惑它应该在哪里使用.请参阅以下内容:

Pro: Odersky1Odersky2

骗局: Beust

在每种情况下,评论都非常好.模式匹配是令人兴奋的东西还是我应该避免使用的东西?实际上,我认为答案是"这取决于你何时使用它",但它有哪些积极的用例和什么是负面用例?

oop scala pattern-matching design-principles

13
推荐指数
2
解决办法
2141
查看次数

正则表达式匹配简单域

我想匹配一个简单的域名:example.com

但它的所有组合.

我该怎么做才能涵盖:

https://example.com
http://www.example.com
etc.

regex pattern-matching

13
推荐指数
3
解决办法
4万
查看次数

当使用"when"时,F#不完整模式匹配此表达式.为什么?

我有这个简单的F#功能:

let compareNum x =
    let y = 10
    match x with
    | _ when x = y -> 0
    | _ when x > y -> 1
    | _ when x < y -> -1
Run Code Online (Sandbox Code Playgroud)

但是,F#编译器给出了"此表达式上的不完整模式匹配"警告.在这种情况下,所有案例都应涵盖所有模式.

我还在Chris Smith的第1版Programming F#book中的"Pattern Matching"部分看到了一个类似的例子.所以在F#的后期版本中可能会改变某些内容?

f# pattern-matching guard-clause

13
推荐指数
1
解决办法
2752
查看次数

是否可以在idris的函数定义中使用保护?

在haskell,人们可以写:

containsTen::Num a => Eq a => [a] -> Bool
containsTen (x : y : xs)
    | x + y == 10 = True
    | otherwise = False
Run Code Online (Sandbox Code Playgroud)

是否有可能在伊德里斯写一些相同的东西,而不用它ifThenElse(我的真实案例比上面的更复杂)?

syntax pattern-matching guard-clause idris

13
推荐指数
1
解决办法
1369
查看次数

使用后缀数组和LCP(-LR)实现字符串模式匹配

在过去的几周里,我试图弄清楚如何在另一个字符串中有效地找到字符串模式.

我发现很长一段时间,最有效的方法是使用后缀树.但是,由于这种数据结构在空间上非常昂贵,我进一步研究了后缀数组的使用(使用的空间要少得多).不同的论文,如"后缀数组:一种新的在线字符串搜索方法"(Manber&Myers,1993)指出,搜索子字符串可以在O(P + log(N))中实现(其中P是通过使用二进制搜索和后缀数组以及LCP数组,模式的长度和N是字符串的长度.

我特别研究了后一篇论文来理解搜索算法.这个答案在帮助我理解算法方面做得非常出色(并顺便将其纳入LCP维基百科页面).

但我仍在寻找实现此算法的方法.特别是所提到的LCP-LR阵列的构造看起来非常复杂.

参考文献:

Manber&Myers,1993:Manber,Udi; Myers,Gene,SIAM Journal on Computing,1993,Vol.22(5),pp.935-948,http: //epubs.siam.org/doi/pdf/10.1137/0222058

更新1

只是为了强调我感兴趣的东西:我理解LCP数组,并找到了实现它们的方法.但是,"普通"LCP阵列不适合有效的模式匹配(如参考文献中所述).因此,我对实现LCP-LR阵列感兴趣,这似乎比实现LCP阵列复杂得多

更新2

添加了参考文件的链接

c c++ string pattern-matching

13
推荐指数
1
解决办法
3994
查看次数

Kotlin中元组的模式匹配

我有以下代码

fun changeSelection(item: FileOrFolder, selected: Boolean) {
    selection = when(item) {
        is Folder -> {
            when(selected) {
                true -> selection + item
                false -> selection - item
            }
        }
        is File -> {
            when(selected) {
                true -> selection + item
                false -> selection - item
            }
        }
        else -> throw Exception("unreachable")
    }
}
Run Code Online (Sandbox Code Playgroud)

看起来有点混乱,因为我习惯于斯卡拉

def changeSelection(item: FileOrFolder, selected: Boolean) {
    (item, selected) match {
        case (item: Folder, true) => selection + item
        case (item: Folder, false) => selection - item …
Run Code Online (Sandbox Code Playgroud)

tuples pattern-matching kotlin

13
推荐指数
1
解决办法
3676
查看次数

如何在枚举中匹配自我?

我有一个枚举:

enum Expr {
    Lit(u32),
    Var(Id),
    Ass(Id, u32),
    Add(u32, u32),
    Sub(u32, u32),
    Mul(u32, u32),
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试实现一个方法:

impl Expr {
    fn eval(&self, env: &mut Env) -> Result<u32, String> {
        use Expr::*;

        match *self {
            Lit(l) => Ok(l),
            Var(id) => env.lookup(&id).ok_or_else(|| format!("undefined var {:?}", id)),
            Ass(id, v) => {
                env.assign(id, v);
                Ok(v)
            }
            Add(f, s) => Ok(f + s),
            Sub(f, s) => Ok(f - s),
            Mul(f, s) => Ok(f * s),
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但我收到以下错误:

error[E0507]: cannot move out of borrowed content …
Run Code Online (Sandbox Code Playgroud)

enums pattern-matching rust

13
推荐指数
1
解决办法
2919
查看次数

为什么案例[]这么慢?有什么技巧可以加快速度吗?

在尝试粘贴图像时,我发现这Cases[]很慢.

要重现,首先将大图像复制到剪贴板(只需按Print Screen),然后评估以下内容:

In[33]:= SetSystemOptions["PackedArrayOptions" -> "UnpackMessage" -> True];

In[34]:= AbsoluteTiming[nb = NotebookGet@ClipboardNotebook[];]
Out[34]= {0.4687500, Null}

In[35]:= AbsoluteTiming[d1 = nb[[1, 1, 1, 1, 1, 1, 1]];]
Out[35]= {0., Null}

In[36]:= AbsoluteTiming[d2 = First@Cases[nb, r_RasterBox :> First[r], Infinity, 1];]

During evaluation of In[36]:= Developer`FromPackedArray::unpack: Unpacking array in call to Notebook. >>

Out[36]= {0.9375000, Null}
Run Code Online (Sandbox Code Playgroud)

(我在Windows上做了这个,不确定其他系统上的粘贴代码是否相同.)

请注意,CasesPart直接使用相比,使用提取数据非常慢,即使我明确告诉Cases我只需要一个匹配.

我确实发现(如上所示)Cases由于某种原因触发解包,即使搜索应该在它到达内部的打包数组之前停止.使用比Infinity可能避免解包的浅层规范.

问题:Cases在这里 使用比Part(如果子表达式可以出现在不同的位置怎么样?)更容易和更可靠?有没有办法在Cases这里快速,可能通过使用不同的模式或不同的选项?


可能相关的问题:Mathematica的模式匹配效果不佳? …

performance wolfram-mathematica pattern-matching

12
推荐指数
1
解决办法
737
查看次数

更复杂的版本"如何在Python中重复自己的字符串?"

我正在阅读这篇文章,我想知道是否有人能找到将重复图案捕捉到更复杂字符串的方法.

例如,找到所有重复的图案

string = 'AAACACGTACGTAATTCCGTGTGTCCCCTATACGTATACGTTT'
Run Code Online (Sandbox Code Playgroud)

这里重复的主题:'AAAC ACGTACGT AATTCC GTGTGT CCCC TATACGTATACG TTT'

所以,输出应该是这样的:

output = {'ACGT': {'repeat': 2,
                   'region': (5,13)},
          'GT': {'repeat': 3,
                 'region': (19,24)},
          'TATACG': {'repeat': 2,
                     'region': (29,40)}}
Run Code Online (Sandbox Code Playgroud)

该实例来自称为微卫星的典型生物现象,其存在于DNA中.

更新1:从字符串变量中删除了星号.那是一个错误.

更新2:单个字符图案不计算在内.例如:在ACGUG AAA GUC中,不考虑"A"主题.

python string bioinformatics pattern-matching

12
推荐指数
1
解决办法
407
查看次数

组合使用null-checks和Pattern Matches的'if'语句时出错

以下按预期工作:

dynamic foo = GetFoo();

if (foo != null)
{
    if (foo is Foo i)
    {
        Console.WriteLine(i.Bar);
    }
}
Run Code Online (Sandbox Code Playgroud)

但如果我像这样结合if语句:

if (foo != null && foo is Foo i)
{
    Console.WriteLine(i.Bar);
}
Run Code Online (Sandbox Code Playgroud)

然后我收到编译器警告

Use of unassigned local variable 'i'

谁能解释为什么会这样?

c# pattern-matching

12
推荐指数
1
解决办法
194
查看次数