似乎Frege關於類型類別的想法與Haskell有很大不同。特別是:Frege類如何工作?
的語法似乎是不同的,沒有明顯的理由。
函數類型不能有類實例。 (看起來相當奇怪的規則......)
語言規範說明了在子類實例聲明中實現超類的一些事情。 (但是,如果你有鑽石繼承...這不會是一個錯誤,但它不能保證以某種方式工作?)
弗雷格是關於什麼樣的實例不那麼挑剔。 (類型別名是允許的,類型變量不需要是不同的,等等)
方法可以聲明爲
native
,雖然它不完全清楚這是什麼意思。看來你可以寫
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 = ...
應該工作。但這樣做的工作:
instance Foo FB where foo2 = ... foo3 = ... instance Bar FB where bar1 = ... bar2 = ... bar3 = ...
- 所以,如果我聲明瞭一個方法,在類聲明
native
,這只是設置默認實施該方法?
所以,如果我這樣做
class Foobar f where foo :: f -> Int native foo bar :: f -> String native bar
那麼這只是意味着,如果我寫了一些Java本機類的空實例聲明,然後foo
映射到object.foo()
在Java中?
特別是,如果一個類的方法被聲明爲native
,我仍然可以提供一些其他它的實現,如果我選擇?
- 每種類型[構造函數]是一個名稱空間。我知道這將對臭名昭着的命名領域問題有所幫助。我不確定爲什麼你想要在這個命名空間範圍內聲明其他東西...
我想澄清一些小問題。儘管如此,我不認爲他們會適合評論。所以我要編輯這個問題,而不是... – MathematicalOrchid
@MathematicalOrchid - 當然沒問題。 – Ingo
那麼我在哪裏可以幫助完成編寫規範? ;-) – MathematicalOrchid