D中的模式匹配

时间:2011-06-11 12:19:20

标签: functional-programming pattern-matching d

我最近偶然发现了D编程语言,我非常喜欢它。您可以使用C语言进行完全硬件访问,从而实现高级别的编程。

来自一个相当功能性的背景(Haskell,scala)我正在寻找一种在D中模式匹配的方法,但我在http://www.digitalmars.com/d/上找不到任何东西。 在Haskell中,语言本身支持模式匹配。 在Scala中,它是通过case类或提取器(使用unapply方法的普通对象)实现的。

可以在D中执行此操作吗?

std.concurrency中的receive方法,用于在actor类式中执行并发,就像在erlang和scala中一样,在这些方法上使用了大量函数和模式数学。 但我认为它不像其他语言那样灵活。你能用卫兵吗?你能在scala中提取Object的内容吗?

4 个答案:

答案 0 :(得分:9)

Haskell中没有模式匹配内置于语言中,但D具有非常通用的编译时间和反射功能,可以让您在库中匹配类型及其结构。对于匹配的运行时值,您只能使用普通的if / switch ...构造; lazy evaluation of function arguments也可能有助于实现一些运行时匹配技术。

Template Constraints将允许您根据在编译时评估的任何表达式创建函数(模板)重载(D允许您在编译期间执行几乎所有正常代码)。您也可以使用static if获得类似效果。这实际上允许您匹配类型结构。这也是D中常用的技术。

您可能会发现std.algorithm的代码很有趣,查找isInputRange和类似函数 - 它们在类型结构上执行匹配 - 它们将参数类型限制为某些类型类

编译时反思的一些指示:

答案 1 :(得分:8)

没有像Haskell或Scala那样功能强大的专用模式匹配功能。

正如您已经想到的那样,重载和调用(模板化)函数或委托是一种受限制的模式匹配形式。您只能匹配参数类型。

您可以在编译时模板参数上进行模式匹配。也无法在那里提取对象的内容。但是你可以提取一个类型的内容。

例如:

import std.stdio, std.conv;
template match(T...){
    enum match = "default case";
}
template match(string a : "x", int b : 1, int  c){
    enum match = "matched 1, b="~to!string(b);
}
template match(int a, string b, int c : 100){
    enum match = "matched 2, b="~b;
}
template match(T : T[]*[]){
    enum match = "matched 3, an array of pointers to an array of "~T.stringof;
}


void main(){
    int a=100;
    writeln(match!("x",1,5));        // "matched 1, b=1"                                                                                                     
    writeln(match!(12,"str"));       // "default case"                                                                                                       
    writeln(match!(12,"str",100));   // "matched 2, b=str"                                                                                                   
    writeln(match!(int*[]*[]));      // "matched 3, an array of pointers to an array of int*"                                                                
    //writeln(match!(12,"str",a));   // would be error, because 'a'                                                                                            
                                     // is not evaluable during compile time                                                                                 
}

如果您有兴趣,可以查看http://d-programming-language.org/template.html

'是' - 表达式是对类型进行模式匹配的另一种方式,请参阅

http://d-programming-language.org/expression.html(搜索“IsExpression”)。

答案 2 :(得分:0)

sumtype软件包提供了求和类型和模式匹配。

答案 3 :(得分:-1)

如果您不坚持使用D2和/或Phobos,则可以使用tango library。它有regex module你可以使用。 [编辑] D2 / Phobos中还有一个正则表达式模块[/ Edit]如果你坚持使用D2和/或Phobos,你可以尝试移植它。这不应该太难。

Tango是另一种标准的lib。许多探戈开发者和用户不喜欢D2的方式,而且大部分都坚持使用D1。这就是为什么只有一些不完整port到D2的原因。

还有项目scregex,它提供静态编译的正则表达式。我已经自己使用它并且它有效。但我认为它也只是D1。然而,它适用于phobos和探戈。