Quando si utilizzano tipi Esistenziali, è necessario utilizzare una sintassi di corrispondenza del modello per l'estrazione del valore di forall
ed. Non possiamo usare i normali selettori di record come funzioni. GHC segnala un errore e suggerire utilizzando pattern-matching con questa definizione di yALL
:Perché non posso utilizzare selettori di record con un tipo quantificato in modo esistenziale?
{-# 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
Alcuni dei miei dati richiede più di 5 elementi. E 'difficile mantenere il codice se uso di pattern-matching:
func1 (BigData _ _ _ _ elemx _ _) = func2 elemx
C'è un buon metodo per rendere il codice come quello mantenibile o per avvolgerlo in modo che posso usare un qualche tipo di selettori?
Suggerimento: quale sarebbe il tipo di "theA"? –
@Louis Wasserman: vuoi dire che usi la sintassi esistenziale in yALL? Come? – Nybble
Fondamentalmente, la risposta è che non ha un tipo esplicito, quindi è necessario abbinare il modello per ottenere un tipo lavorabile. –