模式匹配是最优雅的Haskell功能之一.
我最近在一个项目上工作,我需要一个队列数据结构,所以我正在使用Data.Sequence.然而,看起来我必须放弃模式匹配的优雅并诉诸守卫:
floodFillWorker :: Image -> RGBAColor -> Double -> PixelQueue -> Image
floodFillWorker image base tolerance queue
| Seq.null queue = image
| otherwise = doSomeWork image
Run Code Online (Sandbox Code Playgroud)
我可以使用模式匹配序列,还是需要使用警卫?
每当在Haskell中我们需要一些变量数据类型时,我们会将ADT与模式匹配结合使用.Clojure人们对这些用例有什么用处?
haskell functional-programming clojure abstract-data-type pattern-matching
我一直在玩自然语言解析树并以各种方式操纵它们.我一直在使用斯坦福大学的Tregex和Tsurgeon工具,但代码很混乱,并不适合我的Python环境(这些工具是Java,不适合调整).我想要一个工具集,当我需要更多功能时,它可以轻松进行黑客攻击.还有其他工具非常适合在树上进行模式匹配,然后操纵那些匹配的分支吗?
例如,我想将以下树作为输入:
(ROOT
(S
(NP
(NP (NNP Bank))
(PP (IN of)
(NP (NNP America))))
(VP (VBD used)
(S
(VP (TO to)
(VP (VB be)
(VP (VBN called)
(NP
(NP (NNP Bank))
(PP (IN of)
(NP (NNP Italy)))))))))))
Run Code Online (Sandbox Code Playgroud)
和(这是一个简化的例子):
例如,采取树的这一部分:
(NP
(NP (NNP Bank))
(PP (IN of)
(NP (NNP America))))
Run Code Online (Sandbox Code Playgroud)
把它变成这个:
(NP
(NP (NNP Bank) (IN of) (NP (NNP America))))
Run Code Online (Sandbox Code Playgroud)
由于我的输入树是S表达式,我考虑使用Lisp(嵌入到我的Python程序中)但是我已经写了很长时间,我在Lisp中编写了一些重要内容,我不知道从哪里开始.
什么是描述模式的好方法?什么是描述操纵的好方法?什么是思考这个问题的好方法?
所以,我对OCaml完全不熟悉,并且在实现我的第一个函数方面进展缓慢.我理解困难的一件事是何时使用模式匹配能力
let foo =
[] -> true
| _ -> false;;
Run Code Online (Sandbox Code Playgroud)
vs使用if else结构
let foo a =
if a = [] then true else false;;
Run Code Online (Sandbox Code Playgroud)
我什么时候应该使用?
我有一个恼人的闭源工具,它将特定信息写入其配置文件.如果您尝试在其他文件上使用配置,则会加载旧文件.哎呀...
幸运的是,配置文件是文本,因此我可以对它们进行版本控制,结果发现,如果只是从文件中删除了违规行,则不会造成任何损害.
但是该工具不断将线路放回去.所以每次我想检查配置文件的新版本时,我都必须删除包含该符号的所有行openDirFile.
我即将构建某种bash命令来在每个文件上运行grep -v,将结果存储在临时文件中,然后删除原始文件并重命名临时文件,但我想知道是否有人知道一个很好的清洁解决方案,或者已经编造并调试了类似的调用.
为了额外的功劳,如何在不破坏同一目录中的符号链接的情况下完成这项工作(favourite.rc-> signals.rc)?
复杂的标题,但这是我想要实现的一个简单的例子:
d <- data.frame(v1 = c(1,2,3,4,5,6,7,8),
v2 = c("A","E","C","B","B","C","A","E"))
m <- data.frame(v3 = c("D","E","A","C","D","B"),
v4 = c("d","e","a","c","d","b"))
Run Code Online (Sandbox Code Playgroud)
在价值d$v2应该由值来代替m$v4从值相匹配d$v2的m$v3
生成的数据框d应如下所示:
v1 v4
1 a
2 e
3 c
4 b
5 b
6 c
7 a
8 e
Run Code Online (Sandbox Code Playgroud)
我尝试了不同的东西,我最接近的是: d$v2 <- m$v4[which(m$v3 %in% d$v2)]
我试着再次避免任何for循环!必须是可能的:-)不知怎的......;)
以下不起作用.
object Foo {
def union(s: Set[Int], t: Set[Int]): Set[Int] = t match {
case isEmpty => s
case (x:xs) => union(s + x, xs)
case _ => throw new Error("bad input")
}
}
Run Code Online (Sandbox Code Playgroud)
错误:未找到:输入xs
如何在一组上进行模式匹配?
我正在尝试使用模式匹配来编写计算器应用程序.
两种主要类型定义如下:
type key = Plus | Minus | Multi | Div | Equals | Digit of int;;
type state = {
lcd: int; (* last computation done *)
lka: key; (* last key actived *)
loa: key; (* last operation actived *)
vpr: int (* value print on the screen *)
};;
let print_state s =
match s with
state (a,_,_,d) -> print_int a; //Here has the compile error
print_newline();
print_int d;
print_newline();;
Run Code Online (Sandbox Code Playgroud)
但是,如果我有一个像这样的州:
let initial_state = { lcd=0; …Run Code Online (Sandbox Code Playgroud) 我坚持使用一个简单的正则表达式.不知道我错过了什么.在正则表达式技能上有点生疏.
我想要匹配的表达是:
select * from table where value like '00[1-9]%'
-- (third character should not be 0)
Run Code Online (Sandbox Code Playgroud)
所以这应该匹配'0090D0DF143A'(格式:文本),但它不是!
我似乎找不到在函数头中的地图键上进行模式匹配的方法.有没有办法做到这一点?我正在尝试做的是根据某个键是否已存在于地图中而运行不同的代码(并且还想避免if/else等)
这就是我的代码
def my_func(key, %{key => _} = map), do: ...
Run Code Online (Sandbox Code Playgroud)
这给了我这个错误
**(CompileError)在映射键匹配内非法使用变量键,映射只能使用^键匹配现有变量
当然我也试过用它 ^
def my_func(key, %{^key => _} = map), do: ...
Run Code Online (Sandbox Code Playgroud)
然后给出
**(CompileError)未绑定变量^键
我在Windows 8.1机器上使用elixir 1.3.1/erlang 19.0 x64.谢谢阅读!
pattern-matching ×10
haskell ×2
ocaml ×2
bash ×1
clojure ×1
dataframe ×1
elixir ×1
grep ×1
if-statement ×1
lisp ×1
nlp ×1
postgresql ×1
r ×1
record ×1
regex ×1
replace ×1
s-expression ×1
scala ×1
sed ×1
sql ×1
stanford-nlp ×1
types ×1