4

MaybeHaskell から D で実装したいと思っています。これは私がこれまでに得たものですが、それほど素晴らしいものではありません。それを改善する方法はありますか?

class Maybe(a = int){ }  //problem 1: works only with ints

class Just(alias a) : Maybe!(typeof(a)){ }

class Nothing : Maybe!(){ }


Maybe!int doSomething(in int k){

  if(k < 10)
    return new Just!3;  //problem 2: can't say 'Just!k'
  else
    return new Nothing;
}

Haskell メイビー定義:

data  Maybe a = Nothing | Just a
4

3 に答える 3

5

これを使ったらどうですか

class Maybe(T){ }  

class Just(T) : Maybe!(T){ 
T t;
this(T t){
this.t = t;
}
}
class Nothing : Maybe!(){ }


Maybe!int doSomething(in int k){

  if(k < 10)
    return new Just!int(3); 
  else
    return new Nothing;
}

個人的には、タグ付きのユニオンと構造体を使用します(enforce値を取得するときだけです)

于 2011-12-13T10:30:37.003 に答える
4

私はMaybeライブラリを使用していませんが、次のようなものが適切なようです。

import std.stdio;

struct Maybe(T)
{
    private {
        bool isNothing = true;
        T value;
    }

    void opAssign(T val)
    {
        isNothing = false;
        value = val;
    }

    void opAssign(Maybe!T val)
    {
        isNothing = val.isNothing;
        value = val.value;
    }

    T get() @property
    {
        if (!isNothing)
            return value;
        else
            throw new Exception("This is nothing!");
    }

    bool hasValue() @property
    {
        return !isNothing;
    }
}

Maybe!int doSomething(in int k)
{
    Maybe!int ret;

    if (k < 10)
        ret = 3;
    return ret;     
}

void main()
{
    auto retVal = doSomething(5);
    assert(retVal.hasValue);
    writeln(retVal.get);

    retVal = doSomething(15);
    assert(!retVal.hasValue);
    writeln(retVal.hasValue);
}

いくつかの創造的な演算子のオーバーロードにより、多分構造体は非常に自然に動作する可能性があります。さらに、Maybe構造体をテンプレート化したので、どのタイプでも使用できます。

于 2011-12-13T18:03:31.917 に答える
4

std.typecons.Nullableを見てください。Haskellとまったく同じではありませんが、Maybeインスタンス化された型の値をオプションで保持する型です。つまり、効果的には Haskell のMaybeに似ていますが、構文的には少し異なります。見たい方はソースはこちら。

于 2011-12-13T20:21:41.710 に答える