Re[10]: Result objects - все-таки победили Exceptions?
От: korvin_  
Дата: 10.01.25 06:25
Оценка: +1
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, korvin_, Вы писали:


_>>Где здесь должно быть указано, что new Foo может вернуть не объект класса Foo, а OutOfMemory? В сигнатуре конструктора Foo? В "сигнатуре" оператора new?

S>Примерно там же, где сейчас указано, что new Foo может выбросить OutOfMemoryError. То есть — в "сигнатуре" оператора new.

Сейчас это нигде не указано, кроме, разве что документации. Но вы не про документацию писали, а систему типов.

_>>Тот же вопрос про StackOverflow: где он должен быть указан? В сигнатуре каждой функции (метода)? Операция () вызов метода автоматически должна его добавлять к каждому методу?

S>Если идти по строгому пути — то да, в сигнатуре каждой функции.

Удачи убедить хоть кого-нибудь писать на таком языке.

_>>Теперь Haskell. Имеем такой код, например:


_>>
_>>data Expr
_>>  = Val Int
_>>  | Add Expr Expr
_>>  | Mul Expr Expr
_>>  | If Expr Expr Expr

_>>eval :: Expr -> Expr
_>>eval e = ...

_>>expr0 = If (Mul (Val 1) (Val 0))
_>>           (Add (Mul (Val 4) (Val 10))
_>>                (Val 2))
_>>           (Mul (Add (Val 7) (Val 14))
_>>                (Val 2))

_>>print (eval expr0) -- Val 42
_>>


_>>Где тут должено быть указано OutOfMemory?

S>Хороший вопрос. Надо полагать — везде.

И как это должно выглядеть?

data Expr
  = Val :: Int -> (Expr | OOM)
  | Add :: Expr -> Expr -> (Expr | OOM)
  | Mul :: Expr -> Expr -> (Expr | OOM)
  ...

eval :: Expr -> (Expr | OOM)
...

expr0 = If (Mul (Val 1) (Val 0)) -- упс, (Val 1) возвращает (Expr | OOM), а Mul ожидает чистый Expr
        ...

print (eval expr0) -- и снова: expr0 у нас имеет тип (Expr | OOM), а eval ожидает чистый Expr


Попробуем по-другому:

data Expr
  = Val :: (Int | OOM) -> (Expr | OOM)
  | Add :: (Expr | OOM) -> (Expr | OOM) -> (Expr | OOM)
  | Add :: (Expr | OOM) -> (Expr | OOM) -> (Expr | OOM)
  ...

eval :: (Expr | OOM) -> (Expr | OOM)
...

expr0 = If (Mul (Val 1) (Val 0))
        ...

-- ну и print, конечно, должен иметь сигнатуру вида
-- print :: Show a => (a | OOM) -> (IO () | OOM)


То есть фактически OOM придётся писать буквально везде. Добавим сюда также StackOverflow, DivisionByZero и чёрт знает что ещё.

Удачи убедить хоть кого-нибудь писать на таком языке, да и самому не свихнуться от такого.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.