저는 D를 처음 접했고, 하스켈과 같은 타입 클래스로 프로그래밍하는 좋은 방법을 찾고 있습니다. Functor, Monoids 등 D.D의 형질을 유형 클래스에 사용할 수 있습니까?
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) { return a + b;}
}
유형이 매개 변수 모노 이드 할 필요가 다음과 같이 표현 될 수있는 일반적인 알고리즘 :
template genericfunctions() {
T TestMonoid(T,N = Monoid!T)(T a) {
return N.mappend(N.mzero(),a);
}
}
그러나 템플릿 매개 변수를 생략하려면 필요한 모든 Monoid 인스턴스를 가져 와서 genericfunctions
템플릿을 혼합해야합니다.
import Monoid;
import std.stdio;
import std.conv;
mixin genericfunctions;
void main() {
writefln(to!string(TestMonoid(3)));
writefln(to!string(TestMonoid(3.3243)));
}
이제 int 및 double을 Monoids로 사용할 수 있습니다.
당신이 인스턴스 자체가 제네릭은 Functor 같은 종류의 클래스가있을 때 일을 더 복잡 얻을 그러나 :
module Functors;
// generic Functor like generic Monoid
class Functor(alias T, A) {
pragma(msg,"Not an instance of Functor");
}
// very simple container to demonstrate functors behavior
class FunctorTest(A) {
public A a;
this(A a) {
this.a = a;
}
}
// instance of Functor for FunctorTest!A
class Functor(alias T:FunctorTest,A) {
static T!B fmap(B)(T!A a, B delegate(A) fn) {
return new T!B(fn(a.a));
}
}
한 알고리즘은 다음과 같을 것이다 :
template genericfunctions() {
T TestMonoid(T,N = Monoid!T)(T a) {
return N.mappend(N.mzero(),a);
}
// F is the Functor, A the functors type before,
// B the functors Type after, N is the instance of Functor
F!B fmap(alias F,A,B,N=Functor!(F,A))(F!A a, B delegate(A) fn) {
return N.fmap!B(a,fn);
}
}
을 다행히도을, 당신은 생략 할 수 있습니다 네 가지 템플릿 매개 변수를 사용할 때 :
mixin genericfunctions;
void main() {
auto a = new FunctorTest!int(3);
auto b = fmap(a,(int b) {return b+ 0.5;});
writefln(to!string(b.a));
}
하지만 원하는 경우 Type에 대해 다른 Functor 인스턴스를 사용하려면 fmap의 4 가지 유형 매개 변수를 모두 지정해야합니다. 인스턴스를 지정하기 만하면되고 다른 매개 변수는 여기서 추론 할 수있는 방법이 있습니까?
서투른 mixin 대안에 대한 대안이 있습니까?
이 접근법의 다른 단점이 있습니까?
다른 방법은 어떻습니까? 지금까지이 글을 읽고에 대한 생각과 답변 : 시간을내어
감사
편집 :
는 D에서 유닛 테스트와 펑 법 등의 제약 조건을 정의 할 수 있습니까? 매우 좋을거야.
비 FP 언어로 된 순수 FP의 구문을 모방하는 것을 포기하는 것이 더 쉬울 수도 있습니다. 당신이하려는 일에 따라 더 쉬울 수도 있고 그렇지 않을 수도 있습니다. – BCS
D는 다중 패러다임 언어이며 일류 함수와 Paint 함수와 같은 FP를 아주 잘 지원합니다.이 함수는 지금까지 내가 아는 Haskell에서만 발견됩니다. 타입 클래스는 추상화에서 프로그래머를 가능하게하는 매우 강력한 기능입니다. 상속에 대한 장점은 기존 유형에 특성을 추가 할 수 있다는 것입니다. 만약 당신이 Monoid 인터페이스를 가지고 있다면, int를 monoid로 사용할 수도없고 다른 타입을 befor로 만들 수도 없었을 것입니다. 그리고 나는 그것들을 D.로 가질 수 있다고 생각합니다.여기서는 기능 측면에서 구현하기가 어렵지만 발신자 측면에서는 인식하지 못합니다. – KIMA