在typeclass实例中仅提及受约束的字段

时间:2018-07-12 13:32:53

标签: haskell typeclass

你好,我想知道有没有一种实现foreach (id in myIdList) { firstname_user = GetFirstNameByQuery("SELECT firstname FROM users WHERE id = " + id); myStringList.Add(firstname_user); } 的{​​{1}}可以在不分解所有类型的情况下对字段施加约束?(或者简单地在不枚举所有其他字段的情况下放置)在实例声明中?)

示例:

type

在最后一行上面看,有什么方法可以仅枚举我们要施加约束的字段? (在我们的示例中,typeclass实现了data A=A | BB | CCC deriving( Show) class T a where mymethod::a->Bool instance T A where mymethod a = length . show $ a >1 data Complex b = Complex{ a::Int, b::A, c::String } instance (T b) => T (Complex a b c) 类型类)。
我们可以放b或其他什么东西不放所有字段吗?

例如
T
甚至更好

wildcards

1 个答案:

答案 0 :(得分:3)

在为mymethod修复了A的实现之后(需要在>的第一个参数周围加上括号),以下对我有用:

data Complex = Complex{
                  a::Int,
                  b::A,
                  c::String
                  }

instance T Complex where
    mymethod c = mymethod (b c)

我已将Complex的类型参数删除了-我怀疑您感到困惑,并认为当{n}出现时,名为b的类型与名为b的字段之间存在联系没错如果需要,可以使该连接明确(在这里,我将使用不同的名称来强调连接的方式,但是您可以在下面放置TyField并保持有效代码):

data Complex aTy bTy cTy = Complex
    { aField :: aTy
    , bField :: bTy
    , cField :: cTy
    }

instance T bTy => T (Complex aTy bTy cTy) where
    mymethod val = mymethod (bField val)