juan_gandhi: (Default)
scala> implicit def const[T](x: => T): Any => T = _ => x
const: [T](x: => T)Any => T

scala> def dome(y: Int => String) = y(42)
dome: (y: Int => String)String

scala> dome(_ + "xxx")
res1: String = 42xxx

scala> dome("do me")
res2: String = do me
juan_gandhi: (Default)
Here 

Actually, Runar is not always exactly right, but he's close. But Tim, his former coworker... do you think it makes sense? To me it's some kind of alchemy. Almost there, but not there.
juan_gandhi: (Default)
https://markkarpov.com/post/free-monad-considered-harmful.html 

Свободные - плохо. (Ну типа почти всегда.)

И про нативные типы в Скале (плагин нужен)

https://github.com/alexknvl/newtypes

wtf

Sep. 22nd, 2017 02:48 pm
juan_gandhi: (Default)
scala> new java.util.Date(Long.MinValue)
res1: java.util.Date = Sun Dec 02 08:47:04 PST 292269055

scala> new java.util.Date(Long.MaxValue)
res2: java.util.Date = Sat Aug 16 23:12:55 PST 292278994

scala> new java.util.Date(Long.MinValue >> 16)
res14: java.util.Date = Thu Apr 06 13:14:04 PST 2491

juan_gandhi: (Default)
Double.NaN shouldBe Double.NaN



org.scalatest.exceptions.TesetFailedException: NaN was not equal to NaN

finding...

Aug. 21st, 2017 04:40 pm
juan_gandhi: (Default)
finding a bug in scala.util.Random - priceless
juan_gandhi: (Default)
Вычисляю, скажем, норму вектора; а там такой TraversableOnce, и он такой, перед тем как начать суммировать, проверяет, уж не пустая ли коллекция; а народная проверка на пустоту, как это принято на джавных языках, состоит в том, чтобы посчитать длину и удостовериться, что оная больше нуля. Ну казалось бы, нахер тебе длина. Ну и т.д. 

Да даже если просто hasNext() чекать, и то, инстанциируется итератор, а для этого нужно фильтровать базар, например, ну и т.д.

Это я вбрасываю реализма. Написал, например, Foldable на джаве, чтобы "ускорить процесс". В три раза, например, на длинных векторах.

Короче, сильные типы важны, но под покровом типов надо как-то хотя бы от боксинга избавиться.
juan_gandhi: (Default)
def matrix(h: VectorSpace, w: VectorSpace, values: Double*): Matrix[w.type, h.type] = {
val m = Matrix(w, h)
for {
i <- 0 until h.dim
j <- 0 until w.dim
} m(i, j) = values(i*w.dim+j)

m
}
The method is in a test, generates matrix from values.



juan_gandhi: (Default)
There seems to be no way to use path-dependent types in a recursive context. Even we pass a type as a type argument, as soon as you introduce a constraint, kaboom, your constraint is used literally. 
juan_gandhi: (Default)
  type voidness = {}
  val nothing: voidness = new {}
juan_gandhi: (Default)
Ну да, я пишу на скале. Но мечтал впендюрить в тип вектора его размер (размерность, по-нашему). Ну скала, не идрис же. Типы-то независимые.

Ан нет, это скала! Впендюрил. Всандалил класс VectorSpace (is it better if I call it LinearSpace? who fucking cares...); и в нем уже вектор. Проверять совместимость при сложении не надо, ну и все такое. К матрице присобачил два свойства - домен (одно пространство) и кодомен (другое пространство). И все заебись! Беру row - оно уже нужного типа и нужной длины, по дефолту, блин! Типы стали зависимы.

А если я так напишу class NormedLinearSpace extends VectorSpace with Norm (норма - у меня уже есть такой класс).

Классно же, а. Кстати, и вопросы перформенса легче решаются. Что-то у меня тайпклассы не пошли в этот раз.

juan_gandhi: (Default)
  private def diagonalize[T](f: Int => T): PartialFunction[(Int, Int), T] =
      { case (i, j) if i == j => f(i) }
juan_gandhi: (Default)
  def Unit(size: Int) = new Matrix.OnFunction(size, size, (i, j) => if (i == j) 1.0 else 0.0)
juan_gandhi: (Default)
Джавасприпт, Хаскель и Скала, и, говорят, OCaml, из-за своей компактности, канают в качестве скриптовых языков.

Питон в этом смысле тоже ничо, но там, во-первых, споткнуться можно много где, во-вторых, на уровне компиляции нам ничего не скажут. Это уже на продакшене ебанется. То-то квора, которая на питоне, деплоится по сто раз в час (а тесты потом гоняют, и кодревью тоже). 
juan_gandhi: (Default)
...for running linear algebra stuff on gpu?

github.com/deeplearning4j/nd4j - for Java
github.com/deeplearning4j/nd4s - for Scala

Judging by the title, got a feeling that yes.
juan_gandhi: (Default)
        val counts = ((0 until 3 map (_ -> 0) toMap) /: (0 until something.length.toInt)) {
          case (c, i) => {
            val k = something.at8(i).toInt
            val v = c(k) + 1
            c + (k -> v)
          }
        }


Just counting. It's a piece of a test, so...

Profile

juan_gandhi: (Default)
juan_gandhi

October 2017

S M T W T F S
1 2 3 45 6 7
8 910 11 12 13 14
15 16 17 18 19 2021
22232425262728
293031    

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Oct. 21st, 2017 03:37 pm
Powered by Dreamwidth Studios