Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 可为空的嵌套对象和Maybe Monad_Vb.net_Monads - Fatal编程技术网

Vb.net 可为空的嵌套对象和Maybe Monad

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)

我正在努力实现一个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)
        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和其他一些语言中看到过类似的想法

简言之,我认为你的想法基本上是正确的,但你试图完成的是不可能的