I thought we were supposed to migrate to OverloadedRecordUpdate
. At least, that’s what I was planning on doing. What’s wrong with this? It seems much better than module-qualifying field names.
{-# LANGUAGE GHC2021 #-}
{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE OverloadedRecordUpdate #-}
{-# LANGUAGE RebindableSyntax #-}
{-# LANGUAGE FunctionalDependencies #-}
import Prelude
data Foo = Foo { foo :: Int }
data Bar = Bar { foo :: Int }
-- Of course this should ultimately be shipped with base, or at least
-- a library that comes with GHC. So far we only have
--
-- https://www.stackage.org/haddock/lts-22.21/base-4.18.2.1/GHC-Records.html#t:HasField
class GetSetField fieldName t fieldType | t fieldName -> fieldType where
getField :: t -> fieldType
setField :: t -> fieldType -> t
-- Inferred type:
--
-- blah :: (GetSetField "foo" t fieldType, Num fieldType) => t -> t
--
-- (AllowAmbiguousTypes is needed for this type)
blah x = x { foo = 5 }
Please don’t give up! This is the first time I’ve heard that optics
supports this functionality. I suspect a lot more people need to hear the message!