Haskell (ghc を使用) で、オブジェクト指向プログラミング言語 (obj.a や obj->a など) のようにパターン マッチングを使用せずにデータ型の値を直接使用する方法はありますか?
私はこのようなものを探しています:
data Obj = Obj {a :: Int, b :: Int}
some :: Obj -> Int
some o = o.a
Haskell (ghc を使用) で、オブジェクト指向プログラミング言語 (obj.a や obj->a など) のようにパターン マッチングを使用せずにデータ型の値を直接使用する方法はありますか?
私はこのようなものを探しています:
data Obj = Obj {a :: Int, b :: Int}
some :: Obj -> Int
some o = o.a
最も近いものは Haskell のレコードで、次のようになります。
data Obj = Obj {a :: Int, b :: Int}
これにより、次の機能が自動的に提供されます。
a :: Obj -> Int
b :: Obj -> Int
これは通常の関数のように呼び出すことができます (明確にするために型注釈を付けています):
(a (o :: Obj)) :: Int
Haskellには、それらに関する優れた章があることを学びましょう。
はい、あなたはすでに半分に達しています。レコード構文を使用して、関数を自動的に作成しました
a (Obj x _) = x
b (Obj _ x) = x
a
したがって、 で値にアクセスできますa myObject
。
しかし、はい、ご覧のとおり、パターン マッチングに要約されます。
RecordWildCards
言語拡張も役立ちます。
{-# LANGUAGE RecordWildCards #-}
data Obj = Obj {a :: Int, b :: Int}
some :: Obj -> Int
some Obj{..} = a + b