2011-09-19 48 views
1

我正在努力實現一個monad可能 - 我在本例中稱爲可空。可空嵌套對象和Maybe可能Monad

可空類是這樣實現的:

Public NotInheritable Class Nullable(Of TClass) 

    Private _value As TClass 
    Private _hasValue As Boolean 

    Public Shared Function Create(ByVal value As TClass) As Nullable(Of TClass) 
     Return New Nullable(Of TClass)(value) 
    End Function 
    Public Shared Function Create() As Nullable(Of TClass) 
     Return New Nullable(Of TClass)() 
    End Function 

    Private Sub New() 
     HasValue = False 
    End Sub 
    Private Sub New(theValue As TClass) 
     Value = theValue 
     HasValue = True 
    End Sub 

    Public Property Value() As TClass 
     Get 
      Return _value 
     End Get 
     Private Set(value As TClass) 
      _value = value 
     End Set 
    End Property 

    Public Property HasValue() As Boolean 
     Get 
      Return _hasValue 
     End Get 
     Private Set(value As Boolean) 
      _hasValue = value 
     End Set 
    End Property 

End Class 

有作爲

Class Parent 
    Public Property ChildClass as Nullable(Of Child) 
End Class 

和一個子類實施一個父類是簡單地

Class Child 
    Public Property ID as String 
    ... other properties below ... 
End Class 

方式的單子是在我需要發佈以下內容訪問ne上的一個屬性時執行的STED子類

dim id = MyParentClass.ChildClass.Value.ID 

但最好想我能夠做的就是有下面的語句

dim id = MyParentClass.ChildClass.Id 

如果ChildClass爲null,則只是返回默認值屬性類型。

我試着實現這個使用默認屬性,並通過屬性設置值爲默認值,但它不會編譯。

這是可能的,或者有更好的方法來設計它 - 或者我可能沒有得到可能的monad?

很多的TIA

西蒙

回答

2

嗯,Maybe定義本身是一個簡單的單個值,可能會或可能不存在,所以這一點是好的。順便說一句,如果你因爲某種原因不喜歡「Maybe」這個名字,我建議考慮使用「Option」而不是「Nullable」,因爲.NET已經使用了Nullable(爲了同樣的目的,與價值類型),而Option是F#調用它,一致性很好。

無論如何,基本上有兩件事你可以用這樣一個值做 - 對這個值應用一個變換(如果有的話),並且摺疊嵌套圖層(例如,將一個可爲空的「foo」變成可以爲空的「富」)。你可以做所有其他的事情,並有能力構建新的價值觀。

的「改造」的操作,最直接通過採取拉姆達(比較通過LINQ使用的Select方法 - 這是同樣的事情)實現,要麼把它應用到包裝的價值或丟棄它,如果沒有價值。 「崩潰」操作非常簡單;只要保持內在價值即可。 LINQ在這裏是一種非常自然的方法 - 您可以將Maybe想象爲表示最多一個元素的可枚舉序列。

也就是說,你可能不想在任何地方使用lambda表達式或LINQ表達式。壞消息是我認爲沒有其他辦法。

我懷疑你所真正想在這裏是隱式應用「變換」操作使用常規的方法調用的語法,同時自動應用「崩潰」的操作,如果該方法也返回一些空的,並且可能提供一個默認值當試圖直接使用缺失值時。這是一個合理的設計,並且非常方便使用,但我認爲這不是可能的(我已經使用C#嘗試了幾個變體,並且我不認爲VB.NET有足夠的幫助)。像這樣的方案的最終結果是能夠在空值上調用方法,並且返回空值而不是空引用異常。作爲一個例子,here's something similar in Ruby,實現了一些元編程技巧,我不認爲VB.NET可以支持。我隱約記得在Javascript和其他一些語言中看到類似的想法。

總之,我認爲你基本上有正確的想法,但你想要悲傷地完成的是不可能的。

+0

+1非常感謝您的回覆。西蒙 –