LINUX.ORG.RU

История изменений

Исправление 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"