Haskell GADT样式数据类型声明问题的记录语法

Haskell GADT样式数据类型声明问题的记录语法,haskell,Haskell,我正在尝试进行以下编译(): 编译器不喜欢我使用的数据步骤a语法 /Users/nhenin/dev/gsdFlow/src/Gsd/CLI/Steps.hs:25:25: error: parse error on input ‘{’ | 25 | WorkOnWorkspacesStep { workOnWorkspaces:: WorkOnWorkspacesStepHandle, clients::Clients } :: Step WorkOnWorkspaces |

我正在尝试进行以下编译():

编译器不喜欢我使用的
数据步骤a
语法

/Users/nhenin/dev/gsdFlow/src/Gsd/CLI/Steps.hs:25:25: error: parse error on input ‘{’
   |
25 |   WorkOnWorkspacesStep  { workOnWorkspaces:: WorkOnWorkspacesStepHandle, clients::Clients } :: Step WorkOnWorkspaces
   |                         ^

                    ^
我遵循这个例子:

  data Term a where
      Lit    { val  :: Int }      :: Term Int
      Succ   { num  :: Term Int } :: Term Int
      Pred   { num  :: Term Int } :: Term Int
      IsZero { arg  :: Term Int } :: Term Bool  
      Pair   { arg1 :: Term a
             , arg2 :: Term b
             }                    :: Term (a,b)
      If     { cnd  :: Term Bool
             , tru  :: Term a
             , fls  :: Term a
             }                    :: Term a
它编译得不好,令人惊讶的是

正确的语法是(疯狂):

因此,在这种情况下,您可能需要:

data Step a  where
  WorkOnWorkspacesStep ::
    { workOnWorkspaces:: WorkOnWorkspacesStepHandle
    , clients::Clients } ->
    Step WorkOnWorkspaces
  WorkOnAWorkspaceStep ::
    { workOnWorkspace::  WorkOnAWorkspaceStepHandle
    , clients::Clients
    , workspace::Workspace
    , workOnWorkspaces:: WorkOnWorkspacesStepHandle } ->
    Step WorkOnAWorkspace
  WorkOnAGoalStep ::
    { workOnAGoal ::     WorkOnAGoalStepHandle
    , clients::Clients
    , workspace::Workspace
    , goal::Goal
    , workOnWorkspace:: WorkOnAWorkspaceStepHandle
    , workOnWorkspaces:: WorkOnWorkspacesStepHandle } ->
    Step WorkOnAGoal
有关参考,请参见(链接部分底部附近)

编辑:不幸的是,这似乎并不合法

但是,对于GADT,还有以下附加约束:具有字段f的每个构造函数必须具有相同的结果类型(模阿尔法转换)


我正在寻找一个旧版本的ghc!这就是我遇到问题的原因……实际上这不起作用,因为对具有相同字段的构造函数类型的限制。
data Foo a where
  Bar :: { fd1 :: T1, fd2 :: T2 } -> Foo b
  --- etc.
data Step a  where
  WorkOnWorkspacesStep ::
    { workOnWorkspaces:: WorkOnWorkspacesStepHandle
    , clients::Clients } ->
    Step WorkOnWorkspaces
  WorkOnAWorkspaceStep ::
    { workOnWorkspace::  WorkOnAWorkspaceStepHandle
    , clients::Clients
    , workspace::Workspace
    , workOnWorkspaces:: WorkOnWorkspacesStepHandle } ->
    Step WorkOnAWorkspace
  WorkOnAGoalStep ::
    { workOnAGoal ::     WorkOnAGoalStepHandle
    , clients::Clients
    , workspace::Workspace
    , goal::Goal
    , workOnWorkspace:: WorkOnAWorkspaceStepHandle
    , workOnWorkspaces:: WorkOnWorkspacesStepHandle } ->
    Step WorkOnAGoal