Thread overview | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
March 24, 2015 D's type classes pattern ? | ||||
---|---|---|---|---|
| ||||
Hi, It's been a long time since I coded some d code... sorry I take the lazy way asking for advices. :D Lets say I want to implement some generic algorithm. I would like to checks the types passed to my algorithm implements a specific interface. interface IStuff(Stuff) { void foo(); } class TypeClass(T, I) : I(T) { alias this T; } void myAwesomeAlgo(Stuff) (TypeClass!(Stuff, IStuff) stuff) { stuff.foo(); } Well it seems that I have worked out my question in trying to formulate it...Would something like this work ? |
March 24, 2015 Re: D's type classes pattern ? | ||||
---|---|---|---|---|
| ||||
Posted in reply to matovitch | More like : import std.stdio; interface IStuff(Stuff) { void foo(); } class TypeClass(T, I) : I(T) { alias this stuff; T stuff; } void myAwesomeAlgo(Stuff) (TypeClass!(Stuff, IStuff) stuff) { stuff.foo(); } struct MyStuff { void foo() { writeln("Hello World !"); } } void main() { alias TypeStuff = TypeClass!(MyStuff, IStuff); TypeStuff stuff; myAwesomeAlgo(stuff); } Doesn't compile btw : kmeans.d(8): Error: members expected kmeans.d(8): Error: { } expected following aggregate declaration kmeans.d(8): Error: Declaration expected, not '(' kmeans.d(12): Error: unrecognized declaration |
March 24, 2015 Re: D's type classes pattern ? | ||||
---|---|---|---|---|
| ||||
Posted in reply to matovitch | Well, just follow that link to the code...it almost compile : http://dpaste.com/3JNP0QD. |
March 24, 2015 Re: D's type classes pattern ? | ||||
---|---|---|---|---|
| ||||
Posted in reply to matovitch | well, alias this is the issue here. interface I { void foo(); } struct S { void foo() {} } class C : I { S s; alias this s; } don't compile...if you have any idea to do otherwise I am greatly interested. Thanks ! |
March 24, 2015 Re: D's type classes pattern ? | ||||
---|---|---|---|---|
| ||||
Posted in reply to matovitch | To resume my goal (last lonely message I promise), how can you statically check a type implement an interface without making this type inherit the interface (otherwise std.traits would do it) ? ps : it seems to me that this is exactly what the haskell compiler do with type classes <- layman opinion |
March 24, 2015 Re: D's type classes pattern ? | ||||
---|---|---|---|---|
| ||||
Posted in reply to matovitch | On Tuesday, 24 March 2015 at 15:51:00 UTC, matovitch wrote:
> Hi,
>
> It's been a long time since I coded some d code... sorry I take
> the lazy way asking for advices. :D
>
> Lets say I want to implement some generic algorithm. I would like
> to checks the types passed to my algorithm implements a specific
> interface.
>
> interface IStuff(Stuff)
> {
> void foo();
> }
>
> class TypeClass(T, I) : I(T)
> {
> alias this T;
> }
>
> void myAwesomeAlgo(Stuff) (TypeClass!(Stuff, IStuff) stuff)
> {
> stuff.foo();
> }
>
>
> Well it seems that I have worked out my question in trying to
> formulate it...Would something like this work ?
interface Foo{
}
void Bar(T : Foo)(T t){
}
but interfaces enable runtime polymorphism, you can just accept the interface itself
void Fun(Foo foo){
}
|
March 24, 2015 Re: D's type classes pattern ? | ||||
---|---|---|---|---|
| ||||
Posted in reply to weaselcat | On Tuesday, 24 March 2015 at 16:44:54 UTC, weaselcat wrote:
> On Tuesday, 24 March 2015 at 15:51:00 UTC, matovitch wrote:
>> Hi,
>>
>> It's been a long time since I coded some d code... sorry I take
>> the lazy way asking for advices. :D
>>
>> Lets say I want to implement some generic algorithm. I would like
>> to checks the types passed to my algorithm implements a specific
>> interface.
>>
>> interface IStuff(Stuff)
>> {
>> void foo();
>> }
>>
>> class TypeClass(T, I) : I(T)
>> {
>> alias this T;
>> }
>>
>> void myAwesomeAlgo(Stuff) (TypeClass!(Stuff, IStuff) stuff)
>> {
>> stuff.foo();
>> }
>>
>>
>> Well it seems that I have worked out my question in trying to
>> formulate it...Would something like this work ?
>
> interface Foo{
> }
> void Bar(T : Foo)(T t){
> }
>
> but interfaces enable runtime polymorphism, you can just accept the interface itself
> void Fun(Foo foo){
> }
Thanks, just to be clear :
void Bar(T : Foo)(T t){
}
is the same as
void Bar(T)(T t) if (is(T == Foo)){
}
and it is checked only at compile time ? (for the runtime I know that what interface were meant for ;)).
|
March 24, 2015 Re: D's type classes pattern ? | ||||
---|---|---|---|---|
| ||||
Posted in reply to matovitch | Wait no ! In that case my type will have to inherit the interface...I don't want that, checking without inheriting...I know thats weird. |
March 24, 2015 Re: D's type classes pattern ? | ||||
---|---|---|---|---|
| ||||
Posted in reply to matovitch | On 03/24/2015 09:56 AM, matovitch wrote: > just to be clear : > > void Bar(T : Foo)(T t){ > } That means "if T can implicitly be converted to Foo". > > is the same as > > void Bar(T)(T t) if (is(T == Foo)){ > } That means "if T is exactly Foo". > and it is checked only at compile time ? Yes to both. Ali |
March 24, 2015 Re: D's type classes pattern ? | ||||
---|---|---|---|---|
| ||||
Posted in reply to matovitch | On 03/24/2015 08:50 AM, matovitch wrote: > Lets say I want to implement some generic algorithm. I would like > to checks the types passed to my algorithm implements a specific > interface. I think you are looking for template constraints. Look at isInputRange's implementation: https://github.com/D-Programming-Language/phobos/blob/master/std/range/primitives.d#L143 Then you can do: void foo(Range)(Range range) if (isInputRange!Range) // <-- { // ... } I have some explanation and examples here: http://ddili.org/ders/d.en/templates_more.html#ix_templates_more.named%20template%20constraint Ali |
Copyright © 1999-2021 by the D Language Foundation