Нельзя сопоставлять поля, не разрешив хотя бы обновление записи (вы либо импортируете поле, либо нет).Я думаю, что ограничение больше, потому что нет очевидного синтаксиса для импорта только методов доступа ...
Надлежащее решение - использовать PatternSynonyms
.Вам понадобится однонаправленный шаблон:
{-# LANGUAGE PatternSynonyms #-}
module MyModule ( Monotype(Monotype) ) where
import Data.Set
data Monotype = MT (Set String) String
pattern Monotype :: Set String -> String -> Monotype
pattern Monotype { monotype_free_variables, monotype_description }
<- MT monotype_free_variables monotype_description
Теперь вы можете сравнивать с Monotype { monotype_free_variables, monotype_description }
, но не можете его построить:
λ> Monotype { monotype_free_variables = f1, monotype_description = f2 } = m1
λ> Monotype f1 f2 = m1
λ> m3 = Monotype { monotype_free_variables = mempty, monotype_description = "" }
<interactive>:3:6: error:
• non-bidirectional pattern synonym ‘Monotype’ used in an expression
• In the expression:
Monotype
{monotype_free_variables = mempty, monotype_description = ""}
In an equation for ‘m3’:
m3
= Monotype
{monotype_free_variables = mempty, monotype_description = ""}
λ> m3 = Monotype mempty ""
<interactive>:4:6: error:
• non-bidirectional pattern synonym ‘Monotype’ used in an expression
• In the expression: Monotype mempty ""
In an equation for ‘m3’: m3 = Monotype mempty ""