Haskell 对受约束的GADT记录使用记录更新语法

Haskell 对受约束的GADT记录使用记录更新语法,haskell,record,typeclass,gadt,Haskell,Record,Typeclass,Gadt,我偶然发现了以下小问题。我正在使用Haskell记录语法和GADT: {-# LANGUAGE GADTs #-} data Test a where Test :: {someString :: String, someData :: a} -> Test a 现在,我想为someData创建一个新的Test值,该值的类型不同,但为someString创建相同的值(以证明使用记录更新语法的合理性): 假设我向Test构造函数添加另一个字段: data Test a where

我偶然发现了以下小问题。我正在使用Haskell记录语法和GADT:

{-# LANGUAGE GADTs #-}

data Test a where 
  Test :: {someString :: String, someData :: a} -> Test a
现在,我想为
someData
创建一个新的
Test
值,该值的类型不同,但为
someString
创建相同的值(以证明使用记录更新语法的合理性):

假设我向
Test
构造函数添加另一个字段:

data Test a where 
  Test :: {someString :: String, someData :: a, someMoreData :: a} -> Test a
然后我必须更改这两个字段以保持代码类型正确:

test :: Test a -> Test Bool
test t = t {someData = True, someMoreData = False}
直到现在,我还不需要GADT,但现在我想给数据类型添加一个类型类约束,例如
Eq

data Test a where 
  Test :: Eq a => {someString :: String, someData :: a} -> Test a
当尝试“更新”
someData
字段时,就像在第一个示例中一样,我突然遇到一个编译器错误:

Couldn't match type ‘a’ with ‘Bool’
  ‘a’ is a rigid type variable bound by
      the type signature for test :: Test a -> Test Bool at Test.hs:18:9
Expected type: Test Bool
  Actual type: Test a
Relevant bindings include
  t :: Test a (bound at Test.hs:19:6)
  test :: Test a -> Test Bool (bound at Test.hs:19:1)
In the expression: t
In the expression: t {someData = True}

我怀疑这与之前的案例中的“问题”是一样的,有两个
a
类型的字段,但有点含蓄。我猜
Eq
类型类的字典被视为构造函数的参数,就像我有一个字段
{eqDict::Eq a}
一样。如果我是对的,那么我还必须以某种方式“更新”“字典字段”,尽管我不知道如何做到这一点。问题是,当类型类像这样涉及时,有没有一种方法可以使用记录更新语法?

恐怕这还不可能;有一个。

太糟糕了,我想我必须坚持我的变通方法。谢谢你的快速回答。
Couldn't match type ‘a’ with ‘Bool’
  ‘a’ is a rigid type variable bound by
      the type signature for test :: Test a -> Test Bool at Test.hs:18:9
Expected type: Test Bool
  Actual type: Test a
Relevant bindings include
  t :: Test a (bound at Test.hs:19:6)
  test :: Test a -> Test Bool (bound at Test.hs:19:1)
In the expression: t
In the expression: t {someData = True}