Здравствуйте, 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 и чёрт знает что ещё.
Удачи убедить хоть кого-нибудь писать на таком языке, да и самому не свихнуться от такого.