Class 弗雷格课程是如何运作的?

Class 弗雷格课程是如何运作的?,class,types,functional-programming,frege,Class,Types,Functional Programming,Frege,似乎弗雷格关于类型类的观点与哈斯克尔有很大的不同。特别是: 语法似乎有所不同,没有明显的原因 函数类型不能有类实例。(这似乎是一条很奇怪的规则……) 语言规范说明了如何在子类实例声明中实现超类。(但如果你有钻石继承权就不会了……这不会是一个错误,但也不能保证在某种程度上起作用?) 弗雷格对一个实例的外观不那么挑剔。(允许使用类型别名,不要求类型变量不同,等等) 方法可以声明为本机,尽管还不完全清楚这是什么意思 似乎可以编写type.method来访问方法。同样,没有任何迹象表明这意味着什么或者

似乎弗雷格关于类型类的观点与哈斯克尔有很大的不同。特别是:

  • 语法似乎有所不同,没有明显的原因

  • 函数类型不能有类实例。(这似乎是一条很奇怪的规则……)

  • 语言规范说明了如何在子类实例声明中实现超类。(但如果你有钻石继承权就不会了……这不会是一个错误,但也不能保证在某种程度上起作用?)

  • 弗雷格对一个实例的外观不那么挑剔。(允许使用类型别名,不要求类型变量不同,等等)

  • 方法可以声明为
    本机
    ,尽管还不完全清楚这是什么意思

  • 似乎可以编写
    type.method
    来访问方法。同样,没有任何迹象表明这意味着什么或者为什么它有用

  • 子类声明可以为超类方法提供默认实现。(?)

简言之,如果有人知道这些东西,可以写一篇解释这些东西是如何工作的,这将是非常有用的。它列在语言规范中,但是描述有点简洁

(关于语法:我认为Haskell的实例语法更符合逻辑。“如果X是Y和Z的实例,那么它也是Q的实例,如下所示……”Haskell的类语法对我来说总是有点奇怪。如果X实现了
Eq
,这并不意味着它实现了
Ord
,而是意味着它可以实现
Ord
,如果它愿意的话。我不确定有什么更好的符号……)


根据国际非政府组织的答复:

  • 我假设为超类方法提供一个默认实现只在“一次全部”声明实例时有效
例如,假设
Foo
Bar
的超类。假设每个类有三个方法(
foo1
foo2
foo3
bar1
bar2
bar3
),并且
Bar
foo1
提供默认实现。这应该意味着

instance Bar FB where foo2 = ... foo3 = ... bar1 = ... bar2 = ... bar3 = ... 这就意味着,如果我为某个Java本机类编写一个空实例声明,那么
foo
映射到Java中的
object.foo()

特别是,如果一个类方法被声明为
本机的
,我仍然可以为它提供一些其他的实现,如果我选择

  • 每个类型[constructor]都是一个命名空间。我知道这对臭名昭著的命名字段问题有什么帮助。我不知道为什么要在此命名空间范围内声明其他内容

    • 您似乎已经非常仔细地阅读了语言规范。伟大的但是,不,类型类/实例与Haskell 2010没有本质区别。就一点点,那一点点是符号化的

      你的观点:

      公元1年。对规则是约束(如果有)附加到类型,并且类名跟随关键字。但是,当多参数类型类被添加到语言中时,这种情况很快就会改变,有利于Haskell语法

      公元2年。同时,完全支持函数类型。这将包含在下一版本中。不过,当前版本只支持(a->b)

      公元3年。对考虑我们的类类层次函子->应用->单元格。您可以只编写以下实例,而不是3个单独的实例:

      instance Monad Foo where
          -- implementation of all methods that are due Monad, Applicative, Functor
      
      公元4年。是的,现在。但是,多参数类型的类将发生更改。lang规范建议遵循Haskell 2010规则

      公元5年。如果使用类型类对Java类层次结构进行建模,则需要这样做。本机函数声明对于类型类/实例来说没有什么特殊之处。因为在类中可以有注释和默认实现(就像在Haskell 2010中一样),所以可以以本机声明的形式提供注释和默认实现,本机声明给出a)类型和b)实现(通过引用Java方法)

      公元6年。这是正交性。正如您可以在M是模块的地方编写M.foo一样,您也可以在T是类型(构造函数)的时候编写T.foo,因为两者都是名称空间。此外,如果您有“记录”,当弗雷格无法推断
      x
      的类型时,您可能需要写入
      T.f x

      foo x = x.a + x.b    -- this doesn't work, type of x is unknown
      -- remedy 1: provide a type signature
      foo :: Record -> Int  -- Record being some data type
      -- remedy 2: access the field getter functions directly
      foo x = Record.a x + Record.b x
      
      公元7年。是的,例如,Ord在比较方面有一个(=)的默认实现。因此,您可以在不实现(=)的情况下创建某个对象的Ord实例

      希望这有帮助。通常,必须说,lang规范需要a)完成和b)更新。要是一天有36个小时就好了

      这里还讨论了句法问题:

      ----第二部分------------

      您的示例将不起作用,因为如果您定义
      instance Foo FB
      ,那么无论其他实例和子类如何,这都必须成立。只有当不存在Foo实例时,才会使用Bar中的默认foo1方法

      那就意味着如果我为 一些Java本机类,然后foo映射到Java中的object.foo()

      是的,但这取决于本机声明,它不必是该Java类的Java实例方法,也可以是静态方法或另一个类的方法,或者只是一个成员访问,等等

      特别是,如果类方法被声明为本机方法,我仍然可以 如果我选择,是否为其提供其他实现

      当然,就像其他默认类方法一样。假设默认类方法是使用模式保护实现的,这并不意味着您必须为实现使用模式保护

      看,

      意思是:请给我一个frege函数
      foo
      ,类型为a->b->c,碰巧使用javaspec实现。(语言参考的第6章中应该如何具体描述。还没有完成。对不起。) 例如:

      native pure int2long "(long)" :: Int -> Long
      
      map int2long [1,2,4]
      
      编译程序
      native [pure] foo "javaspec" :: a -> b -> c
      
      native pure int2long "(long)" :: Int -> Long
      
       ... int2long val ... 
      
      ((long)(unbox(val))
      
      map int2long [1,2,4]
      
      pure native + :: Int -> Int -> Int