标签: pattern-matching

是否有任何基本限制阻止Scala在函数上实现模式匹配?

在像SML,Erlang这样的语言中,我们可以定义这样的函数:

fun reverse [] = []
|   reverse x :: xs  = reverse xs @ [x];
Run Code Online (Sandbox Code Playgroud)

我知道我们可以像这样在Scala中编写模拟(我知道,下面的代码中有很多缺陷):

def reverse[T](lst: List[T]): List[T] = lst match {
  case Nil     => Nil
  case x :: xs => reverse(xs) ++ List(x)
}
Run Code Online (Sandbox Code Playgroud)

但我想知道,如果我们可以在Scala中编写前代码,也许可以放弃后者.

这种语法在未来是否有任何基本限制(我的意思是,真的很基础 - 例如类型推断在scala中的工作方式,或者除了解析器之外的其他东西)?

UPD
以下是它的外观片段:

type T
def reverse(Nil: List[T]) = Nil
def reverse(x :: xs: List[T]): List[T] = reverse(xs) ++ List(x)
Run Code Online (Sandbox Code Playgroud)

syntax functional-programming scala pattern-matching

20
推荐指数
2
解决办法
571
查看次数

在与sed匹配之前删除所有行

我正在使用sed来过滤文件列表.我有一个已排序的文件夹列表,我希望获得特定文件后的所有行.为了完成这个任务,我正在使用这里描述的解决方案,它对我尝试的任何输入都很有效,但是当匹配在第一行时它不起作用.在这种情况下,sed将删除输入的所有行

这是一个例子:

(ssh) fabio@s2 : ~
[0] % ls -1 /
bin
boot
...
sys
tmp
usr
var
vmlinuz

(ssh) fabio@s2 : ~
[0] % ls -1 / | sed '1,/tmp/d'
usr
var
vmlinuz

(ssh) fabio@s2 : ~
[0] % ls -1 / | sed '1,/^bin$/d'
# sed will delete all lines from the input stream
Run Code Online (Sandbox Code Playgroud)

当regexp匹配第一行时,我应该如何更改命令以考虑极限情况?

BTW sed '1,1d'正确工作并仅删除第一行.

regex perl awk sed pattern-matching

20
推荐指数
3
解决办法
3万
查看次数

Raku 中类似 Haskell 的模式匹配

Haskell 和 Rust(以及我不知道的其他语言)有一个他们称之为“模式匹配”的发展。下面是 Haskell 中的一个例子:

data Event = HoldKey Char | PressKey Char | Err String

someFunc = let
    someEvent <- doSomeStuff
    -- What follows is a case expression using pattern matching
    thingINeed <- case someEvent of
                      HoldKey keySym -> process keySym
                      PressKey keySym -> process keySym
                      Err err -> exit err
      in keepDoingStuff
Run Code Online (Sandbox Code Playgroud)

在 Raku 中与此最接近的似乎是 多方法 multifunctions(术语在下面的答案中固定,但 multimethods 也可以工作)。

class Hold  { has $.key; }
class Press { has $.key; }
class Err   { has $.msg; }

multi …
Run Code Online (Sandbox Code Playgroud)

haskell functional-programming pattern-matching raku

20
推荐指数
3
解决办法
734
查看次数

模式匹配如何在F#幕后工作?

我对F#(以及一般的函数式编程)是全新的,但我看到样本代码中到处都使用了模式匹配.我想知道模式匹配实际上是如何工作的?例如,我想它在其他语言中与for循环一样工作,并检查集合中每个项目的匹配.这可能远非正确,它在幕后实际上是如何工作的?

algorithm f# functional-programming pattern-matching

19
推荐指数
2
解决办法
2227
查看次数

如何模式匹配具有多个参数列表的类?

考虑这个课程:

class DateTime(year: Int, month: Int, day: Int)(hour: Int, minute: Int, second: Int)
Run Code Online (Sandbox Code Playgroud)

unapply方法将如何,如果我想匹配以下内容:

dt match {
  case DateTime(2012, 12, 12)(12, _, _) => // December 12th 2012, 12 o'clock
  /* ... */
}
Run Code Online (Sandbox Code Playgroud)

我试过这个:

def unapply(dt: DateTime) = 
  Some((dt.year, dt.month, dt.day),(dt.hour, dt.minute, dt.second))
Run Code Online (Sandbox Code Playgroud)

但这并没有真正起作用.

scala class case pattern-matching unapply

19
推荐指数
2
解决办法
3236
查看次数

在Haskell的模式匹配中是否特别处理了"List"?

我是Haskell的新手,希望这个问题不傻.

我已经看到了很多例子,当我有一个列表时,我能够匹配并将列表的"组合元素"绑定到单个变量:

listSizeDesc :: [a] -> String
listSizeDesc [] = "Emtpy"
listSizeDesc (x:xs) = "Something inside"
Run Code Online (Sandbox Code Playgroud)

但是,我尝试做类似的事情:

foo :: Int -> String
foo 0 = "Zero"
foo (n - 1) = "next number is " ++ show n
Run Code Online (Sandbox Code Playgroud)

它不起作用.

在我看来,(n-1)和(x:xs)都描述了如何"创建"参数并将"组件"绑定到参数.List的匹配方式是为了便于递归而专门设计的吗?因为在我看来,这个匹配/参数绑定逻辑不适用于除(:)之外的其他函数.

haskell pattern-matching

19
推荐指数
3
解决办法
729
查看次数

Scala:Case类unapply vs手动实现和类型擦除

我试图了解Scala对Case Classes的作用,使它们对类型擦除警告有所不同.

假设我们有以下简单的类结构.它基本上是Either:

abstract class BlackOrWhite[A, B]

case class Black[A,B]( val left: A ) extends BlackOrWhite[A,B]

case class White[A,B]( val right: B ) extends BlackOrWhite[A,B]
Run Code Online (Sandbox Code Playgroud)

而你正试图像这样使用它:

object Main extends App {

    def echo[A,B] ( input: BlackOrWhite[A,B] ) = input match {
        case Black(left) => println( "Black: " + left )
        case White(right) => println( "White: " + right )
    }

    echo( Black[String, Int]( "String!" ) )
    echo( White[String, Int]( 1234 ) )
}
Run Code Online (Sandbox Code Playgroud)

一切都编译和运行没有任何问题.但是,当我unapply自己尝试实现该方法时,编译器会发出警告.我使用了以下类结构与Main上面相同的类: …

scala pattern-matching type-erasure case-class unapply

19
推荐指数
2
解决办法
7319
查看次数

模式匹配序列理解的惯用方法是什么?

val x = for(i <- 1 to 3) yield i
x match {
    case 1 :: rest => ... // compile error
}
Run Code Online (Sandbox Code Playgroud)

构造函数无法实例化为期望的类型; found:collection.immutable.::: [B] required:scala.collection.immutable.IndexedSeq [Int]

当匹配收到IndexedSeq而不是LinearSeq时,这与MatchError的问题相同.

问题是,怎么做对了?.toList到处添加似乎不对.并创建一个自己的提取器来处理每一个Seq(如另一个问题的答案所述)如果每个人都这样做会导致一团糟......

我想问题是,为什么我不能影响序列理解的返回类型,或者:为什么不是Seq标准库的这种通用提取器部分?

scala pattern-matching for-comprehension

19
推荐指数
1
解决办法
1万
查看次数

在列表中查找模式

我目前正在寻找一种在整数列表中查找模式的方法,但我将使用的方法适用于字符串和其他具有不同元素的列表.现在让我解释一下我在寻找什么.

我想在整数列表中找到最长的重复模式.例如,

[1, 2, 3, 4, 1, 2, 3]
# This list would give 1, 2, 3
Run Code Online (Sandbox Code Playgroud)

应该丢弃重叠模式.( 不确定 )

[1, 1, 1, 1, 1]
# Should give 1, 1  Not 1, 1, 1, 1
Run Code Online (Sandbox Code Playgroud)

这是什么没有帮助我.

在列表中查找模式(不理解第一个答案背后的逻辑,很少解释.第二个答案只有在解决之前知道模式时才能解决问题.)

从列表中查找整数模式(给出模式并且需要发生的次数.与我的问题不同.)

最常见的子序列问题(大多数人都解决了这个问题,但它并不接近我的.我在搜索模式时需要连续的元素.但是在这个中,单独的元素也算作子序列.)

这是我尝试过的.

def pattern(seq):
    n = len(seq)
    c = defaultdict(int) # Counts of each subsequence
    for i in xrange(n):
        for j in xrange(i + 1, min(n, n / 2 + i)): 
            # Used n / 2 because I figured …
Run Code Online (Sandbox Code Playgroud)

python algorithm performance pattern-matching

19
推荐指数
1
解决办法
5322
查看次数

Redis:查找与模式匹配的键

我如何找到匹配这样的模式的键:

例如:

我有一些钥匙:

abc:parent1

abc:parent2

abc:parent1:child1

abc:parent2:child2

我怎么才能找到

abc:parent1

abc:parent2

pattern-matching redis

18
推荐指数
2
解决办法
4万
查看次数