gpt4 book ai didi

haskell - 是否有必要在类声明的类上下文中指定每个父类(super class)?

转载 作者:行者123 更新时间:2023-12-03 14:59:24 25 4
gpt4 key购买 nike

ArrowList hxt 包中的类具有以下声明:
class (Arrow a, ArrowPlus a, ArrowZero a, ArrowApply a) => ArrowList a where ...
ArrowPlus类被声明为:class ArrowZero a => ArrowPlus a where ...
ArrowZero类被声明为:class Arrow a => ArrowZero a where ...

ArrowApply类被声明为:class Arrow a => ArrowApply a where ...

为什么不能直接写成:class (ArrowPlus a, ArrowApply a) => ArrowList a where ...?

最佳答案

不,没有必要包含所有父类(super class)。如果你写

class (ArrowPlus a, ArrowApply a) => ArrowList a where

它会起作用的。然而,这里有两个明确提及所有父类(super class)的可能原因。
  • 它可能更具可读性,因为您一眼就能看出所有父类(super class)是什么。
  • 它可能会更有效,因为显式列出父类(super class)将导致在运行时直接查找字典,而对于传递父类(super class),它将首先查找父类(super class)的字典,然后查找其中的类成员。

    例如,采用这个继承链:
    module Example where

    class Foo a where
    foo :: a -> String

    class Foo a => Bar a
    class Bar a => Baz a
    class Baz a => Xyzzy a

    quux :: Xyzzy a => a -> String
    quux = foo

    查看为此生成的核心(使用 ghc -c -ddump-simpl ),我们看到这会生成一个查找调用链。它首先在字典中查找 BazXyzzy ,然后 Bar在那,然后Foo ,终于可以查到foo .
    Example.quux
    :: forall a_abI. Example.Xyzzy a_abI => a_abI -> GHC.Base.String
    [GblId, Arity=1, Caf=NoCafRefs]
    Example.quux =
    \ (@ a_acE) ($dXyzzy_acF :: Example.Xyzzy a_acE) ->
    Example.foo
    @ a_acE
    (Example.$p1Bar
    @ a_acE
    (Example.$p1Baz @ a_acE (Example.$p1Xyzzy @ a_acE $dXyzzy_acF)))

    修改Xyzzy的定义明确提及 Foo :
    class (Foo a, Baz a) => Xyzzy a

    我们看到它现在可以得到 Foo直接来自 Xyzzy 的字典一并查找foo在那里面。
    Example.quux
    :: forall a_abD. Example.Xyzzy a_abD => a_abD -> GHC.Base.String
    [GblId, Arity=1, Caf=NoCafRefs]
    Example.quux =
    \ (@ a_acz) ($dXyzzy_acA :: Example.Xyzzy a_acz) ->
    Example.foo @ a_acz (Example.$p1Xyzzy @ a_acz $dXyzzy_acA)

    请注意,这可能是特定于 GHC 的。使用版本 7.0.2 测试。
  • 关于haskell - 是否有必要在类声明的类上下文中指定每个父类(super class)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6782389/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com