我最近偶然发现了D编程语言,我非常喜欢它。您可以使用C语言进行完全硬件访问,从而实现高级别的编程。
来自一个相当功能性的背景(Haskell,scala)我正在寻找一种在D中模式匹配的方法,但我在http://www.digitalmars.com/d/上找不到任何东西。 在Haskell中,语言本身支持模式匹配。 在Scala中,它是通过case类或提取器(使用unapply方法的普通对象)实现的。
可以在D中执行此操作吗?
std.concurrency中的receive方法,用于在actor类式中执行并发,就像在erlang和scala中一样,在这些方法上使用了大量函数和模式数学。 但我认为它不像其他语言那样灵活。你能用卫兵吗?你能在scala中提取Object的内容吗?
答案 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和探戈。