2015-06-01 4 views
4
  1. Является ли Scala строго типизированным? У вас есть пример того, как это отражается в системе языкового типа? Позволяет ли Scala набирать пингу? Позволяет ли оно принуждать?Является ли Scala строго типизированным?

  2. Есть ли у Scala политипы, подобные ML?

Спасибо!

+3

вы в конечном итоге в осиное гнездо здесь, потому что * слабый * или * сильный * типирования (говорит Википедия)] (https://en.wikipedia.org/wiki/Strong_and_weak_typing);) – Carsten

+1

На этот вопрос нельзя ответить, пока вы не дадите точное определение «строго типизировано». –

ответ

5
  1. Да.

Из-за сильного ввода текста он не позволяет «печатать по типу», поскольку я понимаю, что он используется на языке C. Тем не менее, у вас есть субтипирование, поэтому вы можете безопасно использовать значение типа A, где запрашивается значение типа B, если A <: B (A является подтипом или более конкретно, чем B).

Вы можете принуждать типа с использованием a.asInstanceOf[B], однако это будет типа проверено во время выполнения и вызывает исключение быть выброшен, если a не подтип B, за исключением высших kinded типов, которые стираются на JVM, что означает, что такое исключение может быть выбрано только позже, когда будут указаны фактические значения параметров типа.

Другое исключением является структурного типирование которые можно были бы рассматривать как «каламбуры», хотя типобезопасный:

// ordinary type 
trait Foo { 
    def bar: Int 
} 

// structural type 
type Bar = Any { 
    def bar: Int 
} 

def test(b: Bar) = b.bar 

test(new Foo { val bar = 1234 }) // allowed 

Это считается продвинутой функцией, которая редко используется, и даже может быть устаревшим в будущие версии Scala. Это требует отражения времени выполнения и, следовательно, имеет штраф за производительность.

Вы также можете отказаться от системы статического типа, используя специальный Dynamic trait. Или вы можете сделать сумасшедшие вещи using macros, чтобы реализовать свой собственный кастинг.

  1. Идея не эксперт ML. Но если политик просто означает this, тогда это выглядит как обычные более высокоприоритетные (параметризованные) типы или «generics», и ответ будет Да.

    • Пример: функция тождества: def identity[A](x: A): A = x
    • Пример: один параметр типа: trait Option[+A] { def get: A }
+1

Но как насчет '' 1.0 "+ 5',' scala' преобразует '5' в строку и результат' '1.05" '. Здесь Scala ведет себя как слабо типизированный язык. – Akavall

Смежные вопросы