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