为什么打印wtf?模式匹配不适用于结构类型吗?
"hello" match {
case s: { def doesNotExist(i: Int, x: List[_]): Double } => println("wtf?")
case _ => println("okie dokie")
}
Run Code Online (Sandbox Code Playgroud) word 0 = "Zero"
word 1 = "One"
word 2 = "Two"
Run Code Online (Sandbox Code Playgroud)
我如何将像这样的模式匹配函数压缩成一行?
我试过了word 0 = "Zero" word 1 = "One" word 2 = "Two",但那没用.
只是盯着使用Haskell并实现(据我所知),没有直接的方法来检查字符串,看它是否包含一个较小的字符串.所以我想我只是试一试.
基本上,我们的想法是检查两个字符串是否大小相同并且相等.如果检查的字符串较长,则递归地删除头部并再次运行检查,直到检查的字符串长度相同.
其余的可能性我使用模式匹配来处理它们.这就是我想出的:
stringExists "" wordToCheckAgainst = False
stringExists wordToCheckFor "" = False
stringExists wordToCheckFor wordToCheckAgainst | length wordToCheckAgainst < length wordToCheckFor = False
| length wordToCheckAgainst == length wordToCheckFor = wordToCheckAgainst == wordToCheckFor
| take (length wordToCheckFor) wordToCheckAgainst == wordToCheckFor = True
| otherwise = stringExists wordToCheckFor (tail wordToCheckAgainst)
Run Code Online (Sandbox Code Playgroud) GHC给了我一个parse error on input \~如果我尝试在lambda表达式的模式上使用波形符,就像我可以用命名函数做的那样
let step = \~(x,s) -> run (f x) s -- Parse Error
let step ~(x, s) = run (f x) s -- Works fine
Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个Bash脚本,该脚本在case语句中使用变量作为模式.但是我无法让它发挥作用.
案例陈述:
case "$1" in
$test)
echo "matched"
;;
*)
echo "didn't match"
;;
esac
Run Code Online (Sandbox Code Playgroud)
我已经试过分配此$test为aaa|bbb|ccc,(aaa|bbb|ccc),[aaa,bbb,ccc]和其他几个组合.我也尝试了这些作为case语句的模式:@($test),@($(echo $test)),$($test).也没有成功.
编辑
为清楚起见,我希望变量代表多个这样的模式:
case "$1" in
aaa|bbb|ccc)
echo "matched"
;;
*)
echo "didn't match"
;;
esac
Run Code Online (Sandbox Code Playgroud) 我有一组潜在的无限符号:A, B, C, ...还有一个独特的特殊占位符?(其含义将在下面解释).
考虑非空有限树,使得每个节点都附有符号和0或更多非空子树.给定节点的子树的顺序是重要的(因此,例如,如果存在具有2个子树的节点,则我们可以区分哪一个留下,哪一个是正确的).任何给定的符号都可以出现在连接到不同节点的树0中.占位符符号?只能附加到叶节点(即没有子树的节点).根据树的通常定义,树是非循环的.
有限性要求意味着树中的节点总数是正有限整数.由此得出,每个子树中附加符号的总数,树深度和节点总数都是有限的.
树以功能表示法给出:节点由附加到其上的符号表示,如果有任何子树,则后面是括号,其中包含以相同方式递归表示的以逗号分隔的子树列表.所以,例如树
A
/ \
? B
/ \
A C
/|\
A C Q
\
?
Run Code Online (Sandbox Code Playgroud)
表示为A(?,B(A(A,C,Q(?)),C)).
我有一个预先计算的一组不变的树S,它们将被用作匹配的模式.该集合通常具有~10 5个树,并且其每个元素通常具有~10-30个节点.我可以利用足够的时间事先创建最适合我下面所述问题的S表示.
我需要编写一个接受树T(通常有~10 2个节点)的函数,并且如果T包含任何S元素作为子树,则尽可能快地检查,前提是任何带有占位符符号的节点都?匹配任何非空子树(当它出现在T或S)的元素中时.
请建议存储集合S的数据结构和检查匹配的算法.任何编程语言或伪代码都可以.
algorithm optimization tree pattern-matching data-structures
我有这个正则表达式
(?:$|^| )(one|common|word|or|another)(?:$|^| )
Run Code Online (Sandbox Code Playgroud)
除非两个单词彼此相邻,否则匹配正常.
One one's more word'word common word or another word more another
More and more years to match one or more other strings
And common word things and or
Run Code Online (Sandbox Code Playgroud)
在上面它匹配第二one行但不是or它旁边的.同为common和wordINT第三行.
实例:http://regex101.com/r/hV3wQ3
我认为这与非匹配组的数量有关.但是,我不确定如何实现匹配所有单词列表而不包含任何字符的最终目标.
我不希望onein one's或in in word'word匹配.
当使用模式匹配模式匹配并打开所有警告时,我正在观察一个有趣的行为
{-# OPTIONS_GHC -Wall #-}
module Mood where
data Mood = Happy
| Indifferent
| Sad
deriving Show
flipMood :: Mood -> Mood
flipMood Happy = Sad
flipMood Indifferent = Indifferent
flipMood Sad = Happy
flipMood' :: Mood -> Mood
flipMood' mood
| Happy <- mood = Sad
| Indifferent <- mood = Indifferent
| Sad <- mood = Happy
Run Code Online (Sandbox Code Playgroud)
即使flipMood并且flipMood'几乎做同样的事情我得到以下错误消息:
Mood.hs:15:1: Warning:
Pattern match(es) are non-exhaustive
In an equation for ‘flipMood'’: Patterns not matched: _ …Run Code Online (Sandbox Code Playgroud) 类似的问题:使用foreach时将match语句转换为partial函数.现在同样,IntelliJ要求我改进我的代码.不同的是,我使用匹配的值:
val matchMe = "Foo"
keys.foreach(key =>
key match {
case `matchMe` => somethingSpecial()
case _ => somethingNormal(key, calcWith(key))
})
Run Code Online (Sandbox Code Playgroud)
将此重构为匿名模式匹配函数将类似于:
keys.foreach {
case `matchMe` => somethingSpecial(_)
case _ => somethingNormal(_, calcWith(_)) //this doesn't work
}
Run Code Online (Sandbox Code Playgroud)
请注意,在第二种情况下,我不能使用,_因为我需要它两次.有没有办法在这里使用匿名模式匹配功能?
如何解决的问题cannot bind by-move into a pattern guard [E0008]上s?
let res = match Some("hi".to_string()) {
Some(s) if s.len() == 0 => 1,
_ => 3
};
Run Code Online (Sandbox Code Playgroud)
有没有改变它而没有把条件放在手臂?
pattern-matching ×10
haskell ×4
scala ×2
algorithm ×1
bash ×1
optimization ×1
recursion ×1
regex ×1
regex-group ×1
rust ×1
syntax ×1
tree ×1