Skip to content

OverloadedRecordDot is broken when records have a constraint

Summary

Whenever I try to reference a function with a constraint with OverloadedRecordDot syntax, I have an error.

Steps to reproduce

While this code compiles:

{-# LANGUAGE OverloadedRecordDot #-}
module B where

data R = R {myFunc :: String -> Int}

myUsage :: R -> Int 
myUsage r = r.myFunc "42"

Adding a constraint:

{-# LANGUAGE OverloadedRecordDot #-}
module B where

import GHC.Stack

data R = R {myFunc :: HasCallStack => String -> Int}

myUsage :: R -> Int 
myUsage r = r.myFunc "42"

gives me an error:

B.hs:9:13: error:
    • No instance for (GHC.Records.HasField "myFunc" R (String -> Int))
        arising from selecting the field ‘myFunc’
        (maybe you haven't applied a function to enough arguments?)
    • In the expression: r.myFunc
      In the expression: r.myFunc "42"
      In an equation for ‘myUsage’: myUsage r = r.myFunc "42"
  |
9 | myUsage r = r.myFunc "42"

it also fails with a more classic one:

{-# LANGUAGE OverloadedRecordDot #-}
module B where

data R = R {myFunc :: forall a. Show a => a -> Int}

myUsage :: R -> Int 
myUsage r = r.myFunc "42"

which gives

B.hs:7:13: error:
    • No instance for (GHC.Records.HasField "myFunc" R (String -> Int))
        arising from selecting the field ‘myFunc’
        (maybe you haven't applied a function to enough arguments?)
    • In the expression: r.myFunc
      In the expression: r.myFunc "42"
      In an equation for ‘myUsage’: myUsage r = r.myFunc "42"
  |
7 | myUsage r = r.myFunc "42"

Expected behavior

I expects the type-check works as there's no constraint (while propagating it).

Environment

  • GHC version used: 9.4.2 / 9.2.2

Optional:

  • Operating System: NixOS unstable
  • System Architecture: x86_64
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information