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