如果我添加一个新的案例类,这是否意味着我需要搜索所有模式匹配代码并找出新类需要处理的位置?我最近一直在学习这门语言,当我读到一些支持和反对模式匹配的论据时,我一直很困惑它应该在哪里使用.请参阅以下内容:
骗局: Beust
在每种情况下,评论都非常好.模式匹配是令人兴奋的东西还是我应该避免使用的东西?实际上,我认为答案是"这取决于你何时使用它",但它有哪些积极的用例和什么是负面用例?
我想匹配一个简单的域名:example.com
但它的所有组合.
我该怎么做才能涵盖:
https://example.com http://www.example.com etc.
我有这个简单的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#的后期版本中可能会改变某些内容?
在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(我的真实案例比上面的更复杂)?
在过去的几周里,我试图弄清楚如何在另一个字符串中有效地找到字符串模式.
我发现很长一段时间,最有效的方法是使用后缀树.但是,由于这种数据结构在空间上非常昂贵,我进一步研究了后缀数组的使用(使用的空间要少得多).不同的论文,如"后缀数组:一种新的在线字符串搜索方法"(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
添加了参考文件的链接
我有以下代码
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) 我有一个枚举:
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) 在尝试粘贴图像时,我发现这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上做了这个,不确定其他系统上的粘贴代码是否相同.)
请注意,Cases与Part直接使用相比,使用提取数据非常慢,即使我明确告诉Cases我只需要一个匹配.
我确实发现(如上所示)Cases由于某种原因触发解包,即使搜索应该在它到达内部的打包数组之前停止.使用比Infinity可能避免解包的浅层规范.
问题:Cases在这里 使用比Part(如果子表达式可以出现在不同的位置怎么样?)更容易和更可靠?有没有办法在Cases这里快速,可能通过使用不同的模式或不同的选项?
可能相关的问题:Mathematica的模式匹配效果不佳? …
我正在阅读这篇文章,我想知道是否有人能找到将重复图案捕捉到更复杂字符串的方法.
例如,找到所有重复的图案
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"主题.
以下按预期工作:
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'
谁能解释为什么会这样?