我偶然发现了以下小问题。我正在使用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;不知何故,虽然我不知道该怎么做。问题是,当涉及类型类时,有没有办法使用记录更新语法?