には、以下の定型を避けるためにきれいな方法があります:レコードのデータ型定義を考えると安全なレコードフィールドクエリ
....
data Value = A{ name::String } | B{ name::String } | C{}
は安全にname
getName :: Value -> Maybe String
getName A{ name=x } = Just x
getName B{ name=x } = Just x
getName C{} = Nothing
を返す関数を書きます
テンプレートハスケルでこれを行うことができることは分かっていますが、私はそれよりもクリーンなソリューションを探しています。おそらくGHCの拡張機能やそれ以外のものを見落としています。
オーバーロードされたレコードフィールドを持つことができないため、これはバニラGHCでコンパイルできません。 – jkeuhlen
@jkeuhlen No. 'name C'の' '*** Exception:レコードセレクタ名にマッチしない ''で失敗する部分関数' name :: Value - > String'を生成します。あなたは_different_データ型の共有フィールドを持つレコードを考えています。 – Alec
データ型の定義にそのような定型文の必要性を導入します。代わりに 'data Value = AorB Bool String | C; getName(AorB _ x)= x; getName _ =何もなし ' – user2407038