Existential型を使用する場合、forall
ed値を抽出するためにパターンマッチング構文を使用する必要があります。通常のレコードセレクターを関数として使用することはできません。GHCはエラーを報告し、次の定義でパターンマッチングを使用することを提案しますyALL
。
{-# LANGUAGE ExistentialQuantification #-}
data ALL = forall a. Show a => ALL { theA :: a }
-- data ok
xALL :: ALL -> String
xALL (ALL a) = show a
-- pattern matching ok
-- ABOVE: heaven
-- BELOW: hell
yALL :: ALL -> String
yALL all = show $ theA all
-- record selector failed
forall.hs:11:19:
Cannot use record selector `theA' as a function due to escaped type variables
Probable fix: use pattern-matching syntax instead
In the second argument of `($)', namely `theA all'
In the expression: show $ theA all
In an equation for `yALL': yALL all = show $ theA all
私のデータのいくつかは5つ以上の要素を取ります。パターンマッチングを使用すると、コードを維持するのが難しくなります。
func1 (BigData _ _ _ _ elemx _ _) = func2 elemx
そのようなコードを保守可能にするか、ある種のセレクターを使用できるようにラップするための良い方法はありますか?