История изменений
Исправление monk, (текущая версия) :
Ты, во первых, полностью реализацию не сделал.
Если ты про метод show, то сделал. «deriving Show» именно это делает. Или что пропустил?
А теперь представь, что в Account не 3, а 100 методов.
Если все 100 методов должны использоваться на произвольных разных типах и не выражаются друг через друга, то, скорее всего, ошибка в архитектуре.
Так для упомянутой задачи было бы правильней:
class AccountClass a where
changeBalance :: a -> Rational -> a
withdraw a i | i > 0 = changeBalance a (-i)
deposit a i | i > 0 = changeBalance a i
data Account = Account Rational | AccountError String
deriving Show
instance AccountClass Account where
changeBalance (Account balance) change =
if balance + change > 0
then Account (balance + change)
else AccountError "Insufficient funds"
data AccountWithCredit = AccountWithCredit Rational Rational | AccountWithCreditError String
deriving Show
instance AccountClass AccountWithCredit where
changeBalance (AccountWithCredit balance credit) amount =
if balance + credit + change >= 0
then AccountWithCredit (balance + amount) credit
else AccountWithCreditError "Insufficient funds"
Исходная версия monk, :
Ты, во первых, полностью реализацию не сделал.
Если ты про метод show, то сделал. «deriving Show» именно это делает. Или что пропустил?
А теперь представь, что в Account не 3, а 100 методов.
Если все 100 методов должны использоваться на произвольных разных типах и не выражаются друг через друга, то, скорее всего, ошибка в архитектуре.
Так для упомянутой задачи было бы правильней:
class AccountClass a where
changeBalance :: a -> Rational -> a
withdraw a i | i > 0 = changeBalance a (-i)
balance a i | i > 0 = changeBalance a i
data Account = Account Rational | AccountError String
deriving Show
instance AccountClass Account where
changeBalance (Account balance) change =
if balance + change > 0
then Account (balance + change)
else AccountError "Insufficient funds"
data AccountWithCredit = AccountWithCredit Rational Rational | AccountWithCreditError String
deriving Show
instance AccountClass AccountWithCredit where
changeBalance (AccountWithCredit balance credit) amount =
if balance + credit + change >= 0
then AccountWithCredit (balance + amount) credit
else AccountWithCreditError "Insufficient funds"