Tob*_*eck 7 haskell record typeclass gadt
我偶然发现了以下小问题.我正在使用Haskell记录语法和GADT:
{-# LANGUAGE GADTs #-}
data Test a where
Test :: {someString :: String, someData :: a} -> Test a
Run Code Online (Sandbox Code Playgroud)
现在我想创建一个Test具有不同类型的新值someData,但是相同的值someString(为了证明记录更新语法的使用):
test :: Test a -> Test Bool
test t = t {someData = True}
Run Code Online (Sandbox Code Playgroud)
假设我在Test构造函数中添加了另一个字段:
data Test a where
Test :: {someString :: String, someData :: a, someMoreData :: a} -> Test a
Run Code Online (Sandbox Code Playgroud)
然后我必须更改两个字段以保持我的代码类型正确:
test :: Test a -> Test Bool
test t = t {someData = True, someMoreData = False}
Run Code Online (Sandbox Code Playgroud)
到现在为止,我不需要GADT,但现在我想为数据类型添加一个类型类约束,例如Eq:
data Test a where
Test :: Eq a => {someString :: String, someData :: a} -> Test a
Run Code Online (Sandbox Code Playgroud)
当尝试"更新" 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}
Run Code Online (Sandbox Code Playgroud)
我怀疑这与前两种类型字段的情况相同"问题" a,但更隐含一点.我想Eq类型类的字典被视为构造函数的参数,就像我有一个字段一样{eqDict :: Eq a}.如果我是对的,那么我还必须以某种方式"更新""字典字段",尽管我不知道如何做到这一点.问题是,当涉及类型类时,有没有办法使用记录更新语法?