Контекст
Если я загружу следующее в ghc-9.2.1-alpha2, который поддерживает RecordDotSyntax:
{-# LANGUAGE OverloadedRecordDot, OverloadedRecordUpdate, DuplicateRecordFields #-}
----------------------------------------------------------------------
data Point = Point { x :: Double, y :: Double }
instance Show Point where
show p = "Point { x = " ++ show p.x ++ ", y = " ++ show p.y ++ " }"
p = Point 10 20
Затем я могу запустить в ghci следующее:
ghci> p { x = 30 }
Point { x = 30.0, y = 20.0 }
Круто, работает!
Проблема
Однако, если я добавлю в свой тестовый файл следующее:
result =
let
a = Point 1 2
b = a { x = 3 }
in
b
и перезагружаюсь, получаю следующее сообщение:
ghci> :r
[1 of 1] Compiling Main ( /home/dharmatech/tmp/test-ghc-9.2.0.20210422/point-update-issue.hs, interpreted )
/home/dharmatech/tmp/test-ghc-9.2.0.20210422/point-update-issue.hs:13:13: error:
RebindableSyntax is required if OverloadedRecordUpdate is enabled.
|
13 | b = a { x = 3 }
| ^^^^^^^^^^^
Failed, no modules loaded.
Что я пробовал
Если я добавлю RebindableSyntax
, как следует из сообщения, я получу еще много ошибок, которые выглядят следующим образом:
/home/dharmatech/tmp/test-ghc-9.2.0.20210422/point-update-issue.hs:3:27: error:
Not in scope: type constructor or class ‘Double’
|
3 | data Point = Point { x :: Double, y :: Double }
|
Вопрос
Есть ли способ заставить это работать? Или это просто еще не реализовано?
Обновление 2021-08-10
Если я добавлю следующее как псевдоним и предложено Ари:
import Prelude
import GHC.Records
Я получаю следующее:
point-update-issue.hs:17:13: error:
Not in scope: ‘setField’
Perhaps you meant ‘getField’ (imported from GHC.Records)
|
17 | b = a { x = 3 }
| ^^^^^^^^^^^
Failed, no modules loaded.
Явно
import Prelude
. При наличии перепривязываемого синтаксиса GHC не импортирует его неявно. См. здесь: downloads.haskell.org/ghc/latest/docs/html/users_guide/exts/…@alias Похоже, это сблизило меня! Теперь ошибок меньше. После добавления
import Prelude
я получаю:Not in scope: ‘getField’
. Думаю, мне нужен еще один явный импорт?getField
происходит отGHC.Records
.@alias Гоша, я мог бы поклясться, что проверил ваше предложение выше и, таким образом, принял ответ. Однако теперь, когда я пытаюсь сделать это снова после добавления
import GHC.Records
, я на самом деле вижу это:Not in scope: ‘setField’
, за которым следуетPerhaps you meant ‘getField’ (imported from GHC.Records)
.