Как каждый пишет Теорему Pythagoras в Scala?

Следующая строка должна быть добавлена ​​к передаваемому объекту $ http:

headers: {'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'}

И переданные данные должны быть преобразованы в строку с кодировкой URL:

> $.param({fkey: "key"})
'fkey=key'

Итак, у вас есть что-то вроде:

$http({
    method: 'POST',
    url: url,
    data: $.param({fkey: "key"}),
    headers: {'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'}
})

От: https://groups.google.com/forum/#!msg/angular/5nAedJ1LyO0/4Vj_72EZcDsJ

UPDATE

Чтобы использовать новые сервисы, добавленные с помощью AngularJS V1.4, см.

24
задан Daniel C. Sobral 29 January 2009 в 14:49
поделиться

4 ответа

Это работает только в Scala 2.8, но действительно работает:

scala> def pythagoras[T](a: T, b: T, sqrt: T => T)(implicit n: Numeric[T]) = {
     | import n.mkNumericOps
     | sqrt(a*a + b*b)
     | }
pythagoras: [T](a: T,b: T,sqrt: (T) => T)(implicit n: Numeric[T])T

scala> def intSqrt(n: Int) = Math.sqrt(n).toInt
intSqrt: (n: Int)Int

scala> pythagoras(3,4, intSqrt)
res0: Int = 5

В более общем плане черта Числовой фактически является справочником о том, как решить этот тип проблемы. . См. Также Заказ .

24
ответ дан 28 November 2019 в 23:28
поделиться

Самый очевидный путь:

type Num = {
  def +(a: Num): Num
  def *(a: Num): Num
}

def pyth[A <: Num](a: A, b: A)(sqrt: A=>A) = sqrt(a * a + b * b)

// usage
pyth(3, 4)(Math.sqrt)

Это ужасно по многим причинам. Во-первых, у нас есть проблема рекурсивного типа, Num. Это только позволяется при компиляции этого кода с -Xrecursive набор опции к некоторому целочисленному значению (5, вероятно, более, чем достаточно для чисел). Во-вторых, тип Num структурен, что означает, что любое использование участников, которых это определяет, будет скомпилировано в соответствующие отражающие вызовы. Помещая его мягко, эта версия pyth неприлично неэффективна, работая на порядке нескольких сто тысяч в 1116 раз медленнее, чем стандартная реализация. Нет никакого пути вокруг структурного типа хотя, если Вы хотите определить pyth для [1 117] какой-либо тип, который определяет +, * и для которого там существует sqrt функция.

Наконец, мы приходим к наиболее основному решению: это сверхсложно. Почему беспокойство, реализовывая функцию таким образом? В сущности единственные типы, к которым это должно будет когда-либо относиться, являются реальными числами Scala. Таким образом является самым легким только сделать следующее:

def pyth(a: Double, b: Double) = Math.sqrt(a * a + b * b)

Все проблемы решены! Эта функция применима на значениях типа Double, Int, Float, даже нечетных как [1 113] благодаря чудесам неявного преобразования. В то время как это верно, что эта функция технически менее гибка, чем наша структурно введенная версия, это значительно более эффективно и чрезвычайно более читаемо. Мы, возможно, потеряли способность вычислить теорему Pythagrean для непредвиденных типов, определяющих + и *, но я не думаю, что Вы собираетесь пропустить ту способность.

18
ответ дан Daniel Spiewak 28 November 2019 в 23:28
поделиться

Есть метод в java.lang.Math:

public static double hypot (double x, double y)

для которого javadocs утверждает:

Возвращает sqrt(x2 +y2) без промежуточного переполнения или недополнения.

заглянув в src.zip, Math.hypot использует StrictMath, который является родным методом:

public static native double hypot(double x, double y);
0
ответ дан 28 November 2019 в 23:28
поделиться

Некоторые мысли по поводу ответа Дэниела:

Я экспериментировал , чтобы обобщить Числовой в Реальный , что было бы более подходящим для этой функции, чтобы обеспечить функцию sqrt . Это приведет к следующему:

def pythagoras[T](a: T, b: T)(implicit n: Real[T]) = {
   import n.mkNumericOps
   (a*a + b*b).sqrt
}

Сложно, но возможно использовать буквальные числа в таких универсальных функциях.

def pythagoras[T](a: T, b: T)(sqrt: (T => T))(implicit n: Numeric[T]) = {
   import n.mkNumericOps
   implicit val fromInt = n.fromInt _

   //1 * sqrt(a*a + b*b)   Not Possible!
   sqrt(a*a + b*b) * 1    // Possible
}

Выведение типа работает лучше, если sqrt передается во втором списке параметров.

Параметры a и b будут передаваться как объекты, но @specialized может это исправить. К сожалению, математические операции по-прежнему будут сопряжены с некоторыми накладными расходами.

Вы можете почти обойтись без импорта mkNumericOps. Я дошел до ужасно близко!

2
ответ дан 28 November 2019 в 23:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: