Vb.net 可为空的嵌套对象和Maybe Monad
我正在努力实现一个maybe monad,在本例中我称之为Nullable 可空类的实现如下所示:Vb.net 可为空的嵌套对象和Maybe Monad,vb.net,monads,Vb.net,Monads,我正在努力实现一个maybe monad,在本例中我称之为Nullable 可空类的实现如下所示: 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)
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
目前monad的实现方式,我需要发布以下命令来访问嵌套子类上的属性
dim id = MyParentClass.ChildClass.Value.ID
但理想情况下,我希望能够做到的是有以下声明
dim id = MyParentClass.ChildClass.Id
如果ChildClass为null,则只返回属性类型的默认值
我尝试使用默认属性实现它,并通过属性将值设置为默认值,但它无法编译
这是可能的,还是有更好的方法来设计它——或者也许我还没有“得到”maybe monad
许多TIA
西蒙好吧,
的定义可能
本身就是一个简单的值,可能存在也可能不存在,所以很多都很好。顺便说一句,如果出于某种原因您不喜欢“Maybe”这个名称,我建议考虑使用“Option”而不是“Nullable”,因为.NET已经使用了Nullable
(甚至是出于同样的目的——但仅限于值类型),而Option
是F#所称的,一致性很好
无论如何,对于这样一个值,基本上可以做两件事——对该值应用转换(如果有),并折叠嵌套层(例如,将“foo”的可空值转换为“foo”的可空值)。只要具备这些条件和构建新价值观的能力,您就可以做其他任何事情
“transform”操作最直接的实现方式是采用lambda(比较LINQ使用的Select
方法——这是同一件事),然后将其应用于包装值,或者在没有值的情况下丢弃它。“崩溃”操作非常简单;只要保留内部值(如果存在)。LINQ在这里是一种非常自然的方法——您可以将可能看作是表示最多一个元素的可枚举序列
也就是说,您可能不希望在任何地方都使用lambdas或LINQ表达式。坏消息是我认为没有其他办法
我猜想您真正想要的是使用常规方法调用语法隐式地应用“transform”操作,同时如果该方法还返回可为null的内容,则自动应用“collapse”操作,并在尝试直接使用缺少的值时可能提供默认值。这是一个合理的设计,使用起来非常方便,但我认为这在这里是不可能的(我自己使用C#尝试了几个变体,我认为VB.NET的差异不足以提供帮助)。这样一个方案的最终结果是能够对null值调用方法,并获得null值而不是null引用异常。举个例子,用一点元编程技巧实现,我认为VB.NET不支持这种技巧。我隐约记得曾在Javascript和其他一些语言中看到过类似的想法
简言之,我认为你的想法基本上是正确的,但你试图完成的是不可能的