4

我想Maybe在 D 中从 Haskell 实现,只是为了它。这是我到目前为止所得到的,但并不是那么好。任何想法如何改进它?

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 结构可以非常自然地运行。此外,我已经对 Maybe 结构进行了模板化,因此它可以与任何类型一起使用。

于 2011-12-13T18:03:31.917 回答
4

看看std.typecons.Nullable。它与 Haskell 中的不完全相同Maybe,但它是一种类型,可以选择保存它被实例化的任何类型的值。所以,实际上,它就像 Haskell 的Maybe,虽然在语法上,它有点不同。如果您想查看源代码,请点击此处。

于 2011-12-13T20:21:41.710 回答