Почему я не могу использовать селекторы записей с экзистенциально квантифицированным типом?

При использовании экзистенциальных типов мы должны использовать синтаксис сопоставления с образцом для извлечения значения foralled. Мы не можем использовать обычные селекторы записей в качестве функций. 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

Есть ли хороший способ сделать такой код удобным для сопровождения или обернуть его так, чтобы я мог использовать какие-то селекторы?

28
задан Christian Conkle 30 November 2014 в 06:14
поделиться