Речь не об этом. Допустим у нас в описании типа класса нет реализации по умолчанию всех функций (и == и /=), допустим также при инстанцировании мы не реализовали ==, но реализовали /=. Внимание вопрос - что будет?
Я понял, о чём речь, поэтому и ответил: "Это необязательно."
А конкретно будет вот что. Допустим такой код:
module Main where
class (Show a) => TestClass a where
foo :: a -> String
foo x = show x ++ " is here"
bar :: a -> String
bar x = foo x ++ " and " ++ baz x
baz :: a -> String
instance TestClass Int where
foo x = "This is " ++ show x
main = do
putStrLn $ foo (5 :: Int)
putStrLn $ bar (5 :: Int)
putStrLn $ baz (5 :: Int)
WinHUGS принял этот код без возражений, но при выполнении выдал исключение:
Main> :main
This is 5
This is 5 and
Program error: undefined member: baz
GHC и GHCi выдали предупреждение об ошибке:
The Glorious Glasgow Haskell Compilation System, version 7.4.1
[1 of 1] Compiling Main ( TestClass.hs, TestClass.o )
TestClass.hs:12:10:
Warning: No explicit method nor default method for `baz'
In the instance declaration for `TestClass Int'
но код приняли, при выполнении ошибка:
*Main> main
This is 5
This is 5 and *** Exception: TestClass.hs:12:10-22: No instance nor default method for class operation Main.baz
D:\Prj\Haskell>TestClass.hs.exe
This is 5
TestClass.hs.exe: TestClass.hs:12:10-22: No instance nor default method for class operation Main.baz
Если не вызывать нереализованные методы, то ничего плохого не будет, разве что компилятор предупреждением поругает. Но если вызвать, то произойдёт ошибка времени исполнения.
Вообще, на этом трюке основан очень простой алгоритм самого эффективного вычисления чисел Фибоначчи -- возведением в степень матрицы (Gosper-Salamin):
{-# OPTIONS_GHC -XTypeSynonymInstances -XFlexibleInstances #-}
type GS = (Integer, Integer)
instance Num GS where
(a,b) * (c,d) = (a*(c+d) + b*c, a*c + b*d)
fib n = fst (x^n)
where x = (1,0) :: GS
Здесь реализован метод умножения матриц, который потом подхватывается дефолтным методом возведения в степень. Получается очень быстро и очень компактно.
Конечно, это потенциальная уязвимость -- возможность вызова нереализованных методов, но компилятор об этой проблеме предупреждает (например, в случае с этим вариантом чисел Фибоначчи компилятор предупреждает, что программист не реализовал методы (+), abs, signum, fromInteger).
Ну, тут авторы языка сделали уступку удобству...
Чем java-класс не модуль? :-) (в рассматриваемом аспекте)
java-класс может быть систанцирован в несколько экземпляров -- в этом и есть проблема.
Приходится идти на ухищрения -- скрывать конструктор класса, обеспечивать возможность использования всего лишь одного экземпляра класса...