使用具有受约束的GADT记录的记录更新语法

时间:2015-09-07 13:11:48

标签: haskell record typeclass gadt

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

{-# LANGUAGE GADTs #-}

data Test a where 
  Test :: {someString :: String, someData :: a} -> Test a

现在我想为Test创建一个不同类型的新someData值,但someString的值相同(以证明记录更新语法的用法):< / p>

test :: Test a -> Test Bool
test t = t {someData = True}

假设我向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

尝试&#34;更新&#34; 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}

我怀疑这是同一个&#34;问题&#34;就像前面两个a类型的字段一样,但更隐含一点。我想Eq类型类的字典被视为构造函数的参数,就像我有一个字段{eqDict :: Eq a}一样。如果我是对的,那么我也必须更新&#34; &#34;字典字段&#34;不知何故,虽然我不知道该怎么做。问题是,当涉及类型类时,有没有办法使用记录更新语法?

1 个答案:

答案 0 :(得分:5)

我担心这还不可能;有一个seven year old outstanding feature request