2011-12-13 54 views
4

我想從D中的Haskell實現Maybe,只是爲了它。 這是我到目前爲止,但它並不是那麼好。任何想法如何改善?如何在D中實現Haskell * Maybe *構造?

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; 
} 

哈斯克爾也許定義:

data Maybe a = Nothing | Just a 

回答

4

看看std.typecons.Nullable。它與Haskell中的Maybe不完全相同,但是它是一種類型,它可以選擇性地保存它實例化的任何類型的值。所以,實際上,它就像Haskell的Maybe一樣,儘管在語法上它有點不同。來源是here如果你想看看它。

+0

我看着它看起來類似於賈斯汀發佈的源代碼。如果它在福博斯,爲什麼要重新發明輪子?我將使用Nullable,:) – Arlen

+0

沒錯,不完全像Haskell'也許',但足夠接近。 – Arlen

+0

它是否適合你的pruposes取決於你想要做什麼。一般來說,我鼓勵你使用'Nullable',因爲它在標準庫中,但是如果你的主要目的只是爲了學習(因爲你的問題可能是這種情況),那就不同了。 –

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它獲得價值正當的)

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結構,因此它可以用於任何類型。