有没有办法可以为不同的模式创建一个具有多个定义的函数,包括在没有其他函数的语句模式匹配时执行的函数?
例如:
someFunc (pattern1) = def1
someFunc (pattern2) = def2
someFunc (<otherwise/all other possible values>) = def3
Run Code Online (Sandbox Code Playgroud)
或者,如果这不可能,它怎么能实现?
提前致谢!
最好的问候,Skyfe.
我发现自己写了这样的东西:
myFnc (MyDataType0 x y z) = someFunction0 (MyDataType0 x y z)
myFnc (MyDataType1 x y) = someFunction1 (MyDataType1 x y)
...
Run Code Online (Sandbox Code Playgroud)
即我需要对某些数据构造函数进行模式匹配,然后使用整个实例.我目前的方法是匹配数据类型,获取其所有字段,然后在函数体中重建它.有没有更好的办法?
为什么这不起作用?
val isGovt = """Govt .*""".r
val Govt = "Govt 23 foobar"
Govt match {
case isGovt(_) => println("match works")
case _ => print("nope. doesn't work")
}
Run Code Online (Sandbox Code Playgroud)
它打印'不.不起作用'.我究竟做错了什么?
我有一个数据框,其中包含一系列与账单ID相对应的六位数字.以奇数开头的ID对应于房屋投票,而偶数编号对应于参议院投票.例如,我的变量看起来像这样:
var <- runif(20, 100000, 999999)
Run Code Online (Sandbox Code Playgroud)
我坚持试图找出一个grep()代码,我可以使用subset()命令来分隔以偶数开头的值和以奇数开头的值.有没有人有什么建议?谢谢!
我试图压缩一些具有类似结构的重复代码:
match self.foo() {
None => self.bar(),
Some(MyStruct { foo: x, .. }) => match x {
Pattern1 => result,
Pattern2 => {
block_result
}
}
}
Run Code Online (Sandbox Code Playgroud)
我想写的类似于:
my_macro!(
Pattern1 => result,
Pattern2 => {
block_result
}
)
Run Code Online (Sandbox Code Playgroud)
避免重复None处理和MyStruct解构.
这看起来应该很简单,因为它基本上只是将宏体代入匹配表达式,但我实际上看不到任何方法可以做到这一点.
我尝试按如下方式编写宏:
macro_rules! my_macro (
($($pat:pat => $result:expr,)*) => (
match self.foo() {
None => self.bar(),
Some(MyStruct { foo: x, .. }) => match x {
$(
$pat => $result,
)*
},
}
);
)
Run Code Online (Sandbox Code Playgroud)
但这失败了,因为匹配臂的RHS可以是表达式或块(并且它也没有处理可选地省略最后一个臂的逗号).据我所知,没有办法指定宏模式的一部分可以是块或表达式,所以我想不出解决这个问题的方法.
理想情况下,我想这样做而不必编写复杂的模式来解构匹配的主体只是为了再次将它们重新组合在一起,但我认为没有任何指示符可以接受匹配表达式的主体. …
我在F#中为简单的数学表达式(用一些自定义函数算术)编写了一个典型的求值器.虽然它似乎工作正常,但某些表达式没有按预期进行评估,例如,这些工作正常:
但这些不是:
代码如下工作,标记化(字符串作为输入) - >到rev-polish-notation(RPN) - > evalRpn
我认为问题似乎发生在一元函数(函数接受一个运算符)的某处,这些是sqrt函数和negation( - )函数.我真的没有看到我的代码出了什么问题.有人可能会指出我在这里缺少的东西吗?
这是我在F#中的实现
open System.Collections
open System.Collections.Generic
open System.Text.RegularExpressions
type Token =
| Num of float
| Plus
| Minus
| Star …Run Code Online (Sandbox Code Playgroud) 我有两个数据集:
data1 就好像
id name
1 1 toyota
2 2 walmart
3 3 fox ad company
Run Code Online (Sandbox Code Playgroud)
data2 就好像
id name
1 1 sales walmart
2 2 fox advertisement company
3 3 metro toyota
Run Code Online (Sandbox Code Playgroud)
在这个实例中考虑我们期望在data2的名称中找到data1的所有名称.
怎么做这个比赛?如果我们在data1和data2之间找到匹配项,我们将打印data1的id.
例如:
id name data2
1 1 toyota 3
2 2 walmart 1
3 3 fox ad company 2
Run Code Online (Sandbox Code Playgroud) 对于在有限域内返回值的案例的长列表,如何减少案件声明的数量增加?比如考虑一下
"abc" match {
case "a" => 1
case "ab" => 1
case "aw" => 2
case "hs" => 2
case "abc" => 1
case _ => 0
}
Run Code Online (Sandbox Code Playgroud)
试Map[Set[String],Int]过去哪里
val matches = Map( Set("a","ab","abc") -> 1, Set("aw","hs") -> 2 )
Run Code Online (Sandbox Code Playgroud)
并定义
def getMatch(key: String, m: Map[Set[String],Int]) = {
val res = m.keys.collectFirst{ case s if s(key) => m(s) }
res.getOrElse(0)
}
Run Code Online (Sandbox Code Playgroud)
是否有更简单和/或更有效的方法?
这是一个演示我的问题的最小例子:
@tailrec
def fun(x: Int): Int = {
val y = x match {
case 5 => return fun(6)
case 7 => return fun(6)
case 6 => 40
case _ => throw new AssertionError("only 5, 6 and 7 allowed")
}
y + 2
}
Run Code Online (Sandbox Code Playgroud)
Eclipse抱怨以下错误消息:
could not optimize @tailrec annotated method
it contains a recursive call not in tail position
Run Code Online (Sandbox Code Playgroud)
由于return关键字,有两个递归调用,就我所知,在尾部位置.
Eclipse究竟抱怨什么?我只是没有看到它.
我有这段代码
middleNumber:: Int -> Int -> Int -> Int
middleNumber a b c
| a == b && a == c = a
| a == b || a == c = a
| b == c = b
| b < a && a < c || c < a && a < b = a
| a < b && b < c || c < b && b < a = b
| otherwise = c
Run Code Online (Sandbox Code Playgroud)
我想使用模式匹配来捕获所有其他输入模式,我试图使用 …