我最近偶然发现了D编程语言,我非常喜欢它.你可以编程真正的高级别,同时拥有完整的硬件访问,如在C.
来自一个相当功能性的背景(Haskell,scala)我正在寻找D模式匹配的方法,但我在http://www.digitalmars.com/d/上找不到任何东西.在Haskell中,语言本身支持模式匹配.在Scala中,它通过case类或提取器(具有unapply方法的普通对象)实现.
可以在D中执行此操作吗?
std.concurrency中的receive方法用于在actor类式中进行并发,就像在erlang和scala中一样,在这些方法上采用了大量的函数和模式数学.但我认为它不像其他语言那样灵活.你能用卫兵吗?你能在scala中提取Object的内容吗?
我是D的新手,我正在寻找一种好的方法来编写类似Haskell的类型类,例如D中的Functors,Monoids等.
这是在Tango或Phobos中实现的吗?
我听说过对某些属性启用编译时类型检查的特性.它们可以用于类型类吗?
我已经尝试了一些模板专业化并想出了这个:
// Monoid.d
// generic Monoid gets called when there is no instance of Monoid for Type T
class Monoid(T) {
pragma(msg, "Type is not a Monoid");
}
// Monoid instance for double
class Monoid(T:double) {
static T mzero() { return 0; }
static T mappend(T a, T b ) { return a + b;}
}
// Monoid instance for int
class Monoid(T:int) {
static T mzero() { return 0; }
static T mappend(T a, T b …
Run Code Online (Sandbox Code Playgroud) 我在D http://www.digitalmars.com/d/2.0/lazy-evaluation.html中找到了函数参数的延迟评估示例
我想知道如何在D中实现可能的无限数据结构,就像它是haskell列表的常见行为一样.
有一些例子吗?
无限斐波那契数列的等价物是什么:
fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
Run Code Online (Sandbox Code Playgroud) 我最近问过这个问题,关于如何在D中模拟类型类,并提出了一种使用模板特化的方法.
我发现D不能识别不同源文件中的模板特化.因此,我只能在未包含在定义泛型函数的文件中的文件中进行专门化.为了说明,请考虑以下示例:
//template.d
import std.stdio;
template Generic(A) {
void sayHello() {
writefln("Generic");
}
}
void testTemplate(A)() {
Generic!A.sayHello();
}
//specialization.d
import std.stdio;
import Template;
template Generic(A:int) {
void sayHello() {
writefln("only for ints");
}
}
void main() {
testTemplate!int();
}
Run Code Online (Sandbox Code Playgroud)
当我运行它时,此代码打印"generic".所以我在问是否有一些好的解决方法,以便可以从算法中使用更专业的表单.
我在关于Type类的问题中使用的解决方法是在使用模板特化导入所有文件后混合泛型函数,但这有点难看且有限.
我听说c ++ 1x将有extern模板,这将允许这个.D有类似的功能吗?
似乎clojure.core.logic在行走集方面存在问题.最小的失败例子:
(run* [q] (== q #{}))
产生
位于clojure.core.logic上的clojure.core.logic.Substitutions.walk(logic.clj:344)的java.lang.StackOverflowError $ clo_ure上的$ walk_STAR_ $ fn_ 2633.invoke(logic.clj:216)$ eval2838 $ fn _2839.invoke(logic.clj:956)at clojure.core.logic.protocols $ eval1389 $ fn_ 1390 $ G _1380__1397.invoke(protocols.clj:55)at clojure.core.logic $ walk_STAR_.invoke(logic. clj:214)at clojure.core.logic $ walk_STAR_ $ fn_ 2633.invoke(logic.clj:218)at clojure.core.logic $ eval2838 $ fn _2839.invoke(logic.clj:956)at clojure.core.logic .protocols $ eval1389 $ fn_ 1390 $ G _1380__1397.invoke(protocols.clj:55)at clojure.core.logic $ walk_STAR_.invoke(logic.clj:214)at clojure.core.logic $ walk_STAR_ $ fn_ 2633.invoke( logic.clj:218)at clojure.core.logic $ eval2838 $ fn _2839.invoke(logic.clj:956)at clojure.core.logic.protocols $ eval1389 $ fn_ 1390 $ G _1380__1397.invoke(protocols.clj:55 )clojure.core.logic $ …