是否有任何工具或方法可用于在两个不同数据源之间通过人名进行匹配?
系统没有其他常见信息,并且在许多情况下输入的名称也不同.
非完全匹配的示例:
小王,马丁路德=国王,马丁(不包括后缀)
欧文,J.博士=欧文,J.(不包括前缀)
奥巴马,巴拉克侯赛因=奥巴马,巴拉克(不包括中间名)
Pufnstuf,HR = Pufnstuf,Haibane Renmei (匹配缩写)
Tankengine,Thomas = Tankengine,Tom(匹配常见的昵称)
Flair,Rick"the Natureboy"= Flair,Natureboy(匹配昵称)
在scala.util.matching.Regex trait MatchData中我看到支持组名,我认为这与(Regex Named Capturing Groups)有关
但是由于Java在版本7之前不支持组名,因为我理解它(参考),Scala版本2.8.0(Java HotSpot(TM)64位服务器VM,Java 1.6.)给了我这个例外:
scala> val pattern = """(?<login>\w+) (?<id>\d+)""".r
java.util.regex.PatternSyntaxException: Look-behind group does not have an obvio
us maximum length near index 11
(?<login>\w+) (?<id>\d+)
^
at java.util.regex.Pattern.error(Pattern.java:1713)
at java.util.regex.Pattern.group0(Pattern.java:2488)
at java.util.regex.Pattern.sequence(Pattern.java:1806)
at java.util.regex.Pattern.expr(Pattern.java:1752)
at java.util.regex.Pattern.compile(Pattern.java:1460)
Run Code Online (Sandbox Code Playgroud)
所以问题是Scala支持的命名捕获组?如果是这样的话有什么例子吗?
通常你有"对称"匹配,并想写下这样的东西:
def g(p:(Int,Int)) = p match {
case (10,n) | (n,10) => println(n)
case _ => println("nope")
}
Run Code Online (Sandbox Code Playgroud)
这是不允许的,但如果每一个可选项具有相同的变量与同一类型的,这不应该是一个问题,因为它可以被翻译成不同的情况:
def g(p:(Int,Int)) = p match {
case (10,n) => println(n)
case (n,10) => println(n)
case _ => println("nope")
}
Run Code Online (Sandbox Code Playgroud)
那么为什么我们有这个限制呢?
有可能做这样的事情:
def foo(x: Int): Boolean = {
case x > 1 => true
case x < 1 => false
}
Run Code Online (Sandbox Code Playgroud) 我知道他们没有跨越模式匹配(即你需要为每个模式重写'where'子句),但是范围如何适用于守卫?
这有用吗?
myFunction x1 x2
| x1 > x2 = addOne x1
| x1 < x2 = addOne x2
| otherwise = x1
where addOne = (1+)
Run Code Online (Sandbox Code Playgroud)
或者应该是这样吗?
myFunction x1 x2
| x1 > x2 = addOne x1
where addOne = (1+)
| x1 < x2 = addOne x2
where addOne = (1+)
| otherwise = x1
Run Code Online (Sandbox Code Playgroud) 我是Haskell的新手.我知道函数是curry成为带有一个参数的函数.我不明白的是,在这种情况下,如何实现与多个值的模式匹配.例如:
假设我们有以下完全任意的函数定义:
myFunc :: Int -> Int -> Int
myFunc 0 0 = 0
myFunc 1 1 = 1
myFunc x y = x `someoperation` y
Run Code Online (Sandbox Code Playgroud)
部分应用的函数是否myFunc 0基本上返回:
partiallyAppliedMyFunc :: Int -> Int
partiallyAppliedMyFunc 0 = 0
partiallyAppliedMyFunc y = 0 `someoperation` y
Run Code Online (Sandbox Code Playgroud)
从而删除无法匹配的无关模式?或者......这里发生了什么?
我试图理解Haskell 2010报告第3.17.2节 "模式匹配的非正式语义".大多数情况,与模式匹配成功或失败有关,似乎很简单,但是我很难理解被描述为模式匹配"发散"的情况.
我被半说服意味着匹配算法没有"收敛"到答案(因此匹配函数永远不会返回).但是,如果不返回,那么,它如何返回一个值,如括号"ie return ?"所示??无论如何"返回" 意味着什么?一个人如何处理这个结果?
第5项具有特别令人困惑的(对我而言)"如果值为?,则匹配发散".这只是说一个值?产生匹配结果??(撇开我不知道那个结果意味着什么!)
任何照明,可能有一个例子,将不胜感激!
经过几个冗长的回答后补遗:感谢Tikhon和所有人的努力.
似乎我的困惑来自于存在两个不同的解释领域:Haskell特征和行为的领域,以及数学/语义领域,而在Haskell文献中,这两者混合在一起,试图用后者来解释前者. ,没有足够的路标(对我来说)属于哪个元素.
显然,"底部" ?位于语义域中,并且不作为Haskell中的值存在(即:您无法输入,您永远不会得到打印为" ?"的结果).
因此,在解释说函数"返回 ?"的地方,这指的是执行任何许多不方便的事情的函数,例如不终止,抛出异常或返回"未定义".是对的吗?
此外,那些评论说?实际上是一个可以传递的价值的人, 实际上是在考虑绑定到尚未被实际评估的普通函数(可以说是"未爆炸的炸弹")并且可能永远不会,由于懒惰,对吧?
有没有办法在Scala中指定与大小更大(或更小)或等于某个值的List匹配的模式?
例如,如果我想对3个或更小的所有列表应用相同的操作:
list match {
case Nil => op(list)
case x :: Nil => op(list)
case x :: y :: Nil => op(list)
case x :: y :: z :: Nil => op(list)
case x :: tail => other(list)
}
Run Code Online (Sandbox Code Playgroud)
有没有办法将此减少到两个案例?
假设我想在do-notation块中分叉一个线程,但我不关心线程id.如果我写
forkIO action
Run Code Online (Sandbox Code Playgroud)
GHC发出警告
警告:
do-not语句丢弃了类型的结果ThreadId.说出这个警告Run Code Online (Sandbox Code Playgroud)_ <- forkOS action
这是一个好主意,因为我想表明该程序正在丢弃某些结果.但是,这样一来,丢弃的东西就不明显了.我可以写
threadId <- forkIO action
Run Code Online (Sandbox Code Playgroud)
但后来我们隐瞒了我们不会threadId在任何地方使用的事实,GHC正确警告
警告:已定义但未使用:
threadId
似乎前置下划线解决了这两个问题:
_threadId <- forkIO action
Run Code Online (Sandbox Code Playgroud)
我的问题是:根据Haskell的语言规范,使用以下划线开头的变量是合法的吗?它有多便携?它在某处记录了吗?是否鼓励这样的案例 - 记录结果被忽略?
我在新的C#7中看到了var模式的这个例子
if (o is var x) Console.WriteLine($"it's a var pattern with the type {x?.GetType()?.Name}");
Run Code Online (Sandbox Code Playgroud)
只是使用有什么不同:
var x = o;
Console.WriteLine($"it's a var pattern with the type {x?.GetType()?.Name}");
Run Code Online (Sandbox Code Playgroud)
当这种模式是一个有用的解决方案.
pattern-matching ×10
haskell ×4
scala ×4
c# ×1
currying ×1
list ×1
portability ×1
regex ×1
scope ×1
string ×1
syntax ×1
where-clause ×1
wildcard ×1