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
[VB.NET] VB で Either 型 (その2) | オールトの雲
[…] [VB.NET] VB で Either 型 […]
Link | 2014年6月11日 23:59