Ответ 1
ИМХО оба действительно хорошие языки, но по отношению к парадигмам Scala делает OO лучше, чем Frege, но Frege работает лучше, чем Scala. Что касается различий, это сводится к главным образом Haskell vs Scala, поскольку Frege (или почти, см. Различия между Haskell и Frege здесь) Haskell для JVM.
-
Вывод типа Frege является глобальным, поэтому нам не нужно вводить аннотации типов так часто, как в Scala (локальный вывод).
-
В Frege модули являются просто пространствами имен для типов и функций, тогда как Scala имеет лучшую модульную систему. http://2013.flatmap.no/spiewak.html
-
В Frege функции имеют значение по умолчанию, поэтому нет необходимости в дополнительных конструкциях для приложения с частичными функциями. То же самое относится к приложению конструктора частичного типа.
-
В Frege нет
def
vsval
, и все это функция. Следовательно, функции более первоклассны, чем Scala. -
У Frege нет подтипов, но система типов вычисляет подтип на основе собственных вызовов. Например, вы можете передать
ArrayList
функции, для которой требуется JavaList
.Поскольку в Frege нет подтипирования, мы не можем расширять Java-класс или реализовывать интерфейс на данный момент (возможно, он будет поддерживаться в будущем), поэтому нам нужно иметь Java-класс, который будет расширяться/реализовываться, но реализация метода будет переданы из функции Фреге как функции.
-
Из Scala легко вызвать Java, но в Frege перед использованием должен быть объявлен класс/метод Java (только аннотации типа и чистоты). Например, чтобы использовать Java
LinkedList
,data LinkedList a = native java.util.LinkedList where native add :: Mutable s (LinkedList a) -> a -> ST s Bool native get :: Mutable s (LinkedList a) -> Int -> ST s (Maybe a) throws IndexOutOfBoundsException native new :: () -> STMutable s (LinkedList a)
Здесь, поскольку функции мутируют объект, они должны находиться в
ST
monad. Также обратите внимание, что здесь Frege также обрабатываетnull
, возвращаемый методомget
, поскольку он аннотируется с типомMaybe
. Единственный способ, с помощью которогоnull
может перейти к вашей программе Frege, - через собственный интерфейс, поскольку у Frege нет понятия null.Другой пример:
pure native floor Math.floor :: Double -> Double
который гласит, что функция чиста и, следовательно, сигнатура непосредственно отражает исходную сигнатуру Java без
IO
илиST
. -
У Frege нет переменных, как в Scala
var
, а побочные эффекты более явными типами. (Просто неnull
, novar
и явные побочные эффекты делают Фреге более интересным, по крайней мере для меня. В некотором смысле, Фреге, как и Haskell, является "обязательным языком программирования" для JVM!) -
Будучи диалектом Haskell, Фреге более естественен в отношении Функторов, Применений, Монад и других функциональных "шаблонов", и в них есть стандартная библиотека, тогда как в Scala вам может понадобиться Scalaz.
-
По умолчанию Frege ленив, но при необходимости можно включить строгость через
!
, тогда как Scala по умолчанию строгая, но имеетlazy
ключевое слово для ленивой оценки.
Тем не менее, будучи языками JVM, один язык может извлечь выгоду из других. Я однажды портировал пример Akka для Frege. В конце концов, это сводится к строгости, чистоте, функциональности, OO и типу вывода и насколько они важны для вас.