[VB.NET] VB で Either 型

2014年6月11日

 Either 型っぽいものが VB で実装できないか、ちょっと試してみた。

' Either型
Interface Either(Of A, B)
End Interface

' Either.Right型
Class Right(Of A, B)
    Implements Either(Of A, B)

    Private _obj As A

    Sub New(obj As A)
        _obj = obj
    End Sub

    Public Function GetValue() As A
        Return _obj
    End Function
End Class

' Either.Left型
Class Left(Of A, B)
    Implements Either(Of A, B)

    Private _obj As B

    Sub New(obj As B)
        _obj = obj
    End Sub

    Public Function GetValue() As B
        Return _obj
    End Function
End Class
' エラーコード用 Enum
Enum ErrorCode
    NoError
    SyntaxError
End Enum
Module Module1

    ' Either型の評価(実処理)
    Sub f(a As Either(Of Tuple(Of Integer, Integer), ErrorCode))

        Select Case a.GetType

            Case GetType(Right(Of Tuple(Of Integer, Integer), ErrorCode))
                Dim b = CType(a, Right(Of Tuple(Of Integer, Integer), ErrorCode))
                Dim c = b.GetValue
                Console.WriteLine(c.Item1 + c.Item2)

            Case GetType(Left(Of Tuple(Of Integer, Integer), ErrorCode))
                Dim b = CType(a, Left(Of Tuple(Of Integer, Integer), ErrorCode))
                Console.WriteLine(b.GetValue.ToString)

        End Select

    End Sub

    ' Main
    Sub Main()
        Dim a = New Right(Of Tuple(Of Integer, Integer), ErrorCode)(Tuple.Create(100, 200))
        f(a)

        Dim b = New Left(Of Tuple(Of Integer, Integer), ErrorCode)(ErrorCode.SyntaxError)
        f(b)

    End Sub

End Module

 結果

300
SyntaxError
続行するには何かキーを押してください . . .

 なんとなく似たようなものはできたけど、型名の記述ばかりで処理が見えない…。煩雑で使い物にならないですね(汗

 これなら Tuple の第一引数にエラーコードを埋める形のほうが、まだスマートな感じです(汗

Module Module1

    ' 評価(実処理)
    Sub f(a As Tuple(Of ErrorCode, Integer, Integer))

        Select Case a.Item1

            Case ErrorCode.NoError
                Console.WriteLine(a.Item2 + a.Item3)

            Case Else
                Console.WriteLine(a.Item1.ToString)

        End Select

    End Sub

    ' Main
    Sub Main()
        Dim a = Tuple.Create(ErrorCode.NoError, 100, 200)
        f(a)

        Dim b = Tuple.Create(ErrorCode.SyntaxError, 0, 0)
        f(b)

    End Sub

End Module





タグ:
カテゴリー: Program, VB.NET

Follow comments via the RSS Feed | Leave a comment | Trackback URL

1 Comment to "[VB.NET] VB で Either 型"

  1. [VB.NET] VB で Either 型 (その2) | オールトの雲

    […] [VB.NET] VB で Either 型 […]

コメントを投稿する

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


«   »
 
Powered by Wordpress and MySQL. Theme by Shlomi Noach, openark.org