レコードの構文を使用するHaskell型があります。Haskell Export Record Only for Read Access
data Foo a = Foo { getDims :: (Int, Int), getData :: [a] }
ユーザーが無効なオブジェクトを構築することができないように私は、Foo
値コンストラクタをエクスポートする必要はありません。しかし、getDims
をエクスポートしたいので、ユーザーはデータ構造の寸法を取得できます。私はこの
module Data.ModuleName(Foo(getDims)) where
を行う場合、ユーザーは、寸法を取得するためにgetDims
を使用することができますが、問題は、彼らはまた、フィールドを更新するレコード更新の構文を使用することができるということです。
getDims foo -- This is allowed (as intended)
foo { getDims = (999, 999) } -- But this is also allowed (not intended)
データを無効な状態にするため、後者を避けたいと思います。私は単にレコードを使うことはできないと思います。
data Foo a = Foo { getDims_ :: (Int, Int), getData :: [a] }
getDims :: Foo a -> (Int, Int)
getDims = getDims_
しかし、これは問題を回避するためにかなりラウンドアバウトな方法のようです。書き込みアクセスではなく、読み取りアクセスのためにレコード名をエクスポートするだけで、レコード構文を引き続き使用する方法はありますか?
いいえ、ありません。後者の例はこれを達成するための標準的な方法であり、依然としてレコードを使用していることに注意してください。あなたが「ラウンドアバウト」と呼んでいるのは、実際には余分な2行のコードだけです。 – user2407038