juan_gandhi: (Default)
isFinite tells us whether we can cache it; maybe it's coming from a predicate that checks the size, or something.


class Cache[K,V](isFinite: Boolean, build: K => V):
  private val cache: mutable.Map[K, V] = mutable.Map[K, V]()

  private val app: K => V = if (isFinite) (k: K) => cache.getOrElseUpdate(k, build(k)) else (k: K) => build(k)
  
  inline def apply(k: K): V = app(k)

juan_gandhi: (Default)

Всё мне не нравится, что тесты на мой категорный код идут часа чуть ли не два. Науськал наконец на неё кводану (Qodana) - типа вот, найдут дефекты перформанса. И вот что я утром вижу:

No problems detected

                                                                   The  found no issues. 


Придётся вручную изучать вопрос. Но на самом деле больше вопросов с зависимыми типами.

juan_gandhi: (Default)

 Затрахался последние дни с проблемами компиляции - добавишь что-нибудь в trait, а компилятор бац - и несёт какую-то херню. Собрался уже вырезать кусочек и послать им багрепорт. Погуглил. Ха, в 3.6.1 баги. А вот 3.6;2 уже вроде бы не рушит компиляцию.

Ну посмотрим, посмотрим. А то сидишь такой рефакторишь, и тут бац - не связанные с этим классом классы перестают компилироваться.

Тьфу.

juan_gandhi: (Default)
Kit Langton, NeoType - a good enhancement of Scala3's opaque types
Scalag - a Scala library for GPU


juan_gandhi: (Default)
 Карен нашла там у меня смешной дефект в коде, что я послал на ревью. Спасибо ей; дефект поправил.

Теперь что. Добавил тесткейс.

Упс. Компилятор кирдык. scalac. Зацикливается.

Окей. Закомментировал пока большую часть того кейса.

Упс. Другие тесты не идут. А чо? А-а--а-а-а! Вставил запятую.

Вот что это вообще.

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

Какая хуйня, прости господи. Надо вернуться на Форт, там дедушки мирные, все улыбаются (и я их почти что в лицо знаю, а уж по сорс-коду так точно, читал как стихи когда-то). Тоже маразм, конечно.

 

juan_gandhi: (Default)
My first chat with chatGPT.
I'm convinced.


 
juan_gandhi: (Default)
object Pathos {
val firsts =
"авто,агро,апо,арахно,аристо,астро,аэро,био,бюро,вело,гастро,гео,гербо,геронто,герпето,гетеро,гидро,гипер,гипно,гомео,гомо,графо,демо,дендро,зоо,изо,ихтио,како,квази,клепто,крипто,мегало,метро,микро,моно,мото,невро,нейтро,некро,неонато,нимфо,олиго,опто,орто,орфо,охло,панто,пара,пато,парто,педо,пиро,плуто,поли,прото,психо,птеро,ретро,тео,топо,физио,фило,фито,фото,шизо,экзо,эко,эндо,энцефало,эпи".split(",").toList
val seconds = "арх,граф,крат,лог,ман,мах,метр,ном,пат,пед,соф,тон,топ,фил,фоб,фон,френ".split(",").toList

val isEndVowel = "аеоуэюя".toSet
val isVowel = "аеиоуэюя".toSet

def word(first: String, second: String) =
if (isVowel(second.head) && isEndVowel(first.last))
first.dropRight(1) + second else first + second

val header =
s"<td/>${seconds map (w => s"<th>&nbsp;$w&nbsp;</th>") mkString ""}"

def row(f: String) =
s"<th aligh=left>&nbsp;$f&nbsp;</th>${seconds map (s => s"<td style='text-align:center'>&nbsp;${word(f,s)}ия&nbsp;</td>") mkString ""}"

val content = (header :: (firsts map row)).mkString("<tr>", "</tr>\n<tr>", "</tr>\n")

def main(args: Array[String]): Unit = {
println(s"<table>$content</table>")
println("<br/>")
println(firsts map(f => s"${f}сексуализм") mkString(", "))
}
}

juan_gandhi: (Default)
 which is applicative but not a monad (solution from stackoverflow)

link

zio http

Feb. 23rd, 2022 09:31 am
juan_gandhi: (Default)
Talk by Tushar. I'm not embedding it, please go there, watch and applaud.
juan_gandhi: (Default)
 gist
class Test extends AnyFlatSpec with Matchers {
"transformer" should "work" in {
// source: https://contributors.scala-lang.org/t/ability-to-force-the-caller-to-specify-a-type-parameter-for-a-polymorphic-method/2116/26
sealed trait NotNothing[-T]

object NotNothing {
@implicitAmbiguous("inst() method needs a generic parameter type, which is missing")
implicit val nothingIsNothing = new NotNothing[Nothing]{}
implicit def notNothing[T] = new NotNothing[T] {}
}

implicit class Transformer(source: String) {
def as[T : NotNothing : ClassTag] = {
import scala.reflect._
val cls: Class[T] = classTag[T].runtimeClass.asInstanceOf[Class[T]]
val cons: Constructor[T] = cls.getDeclaredConstructor(classOf[String])
cons.newInstance(source)
}
}

val a0 = "good A".as[A]
val b0 = "good B".as[B]
a0.getClass shouldBe classOf[A]
b0.getClass shouldBe classOf[B]
a0.toString shouldBe "A(good A)"
b0.toString shouldBe "B(good B)"
}
}

class Base
case class A(val s: String) extends Base
case class B(val s: String) extends Base

juan_gandhi: (Default)
Ну вот мы хотим такую абстрактную фабрику зафигачить,

def inst[T](s: String)(implicit tag: ClassTag[T]): T = {
val cls = tag.runtimeClass
val cons = cls.getDeclaredConstructor(classOf[String])
cons.newInstance(s).asInstanceOf[T]
}

Мол, возьми строку и проинстанциируй тип, какой тебе дадут. Такого конструктора может и не быть, но здесь просто примерчик.
А штука в том, что вот нарисуем мы юзкейсы,

class A(val s: String) extends Zero
class B(val s: String) extends Zero
val a1: A = inst("anA")
val b1: B = inst("aB")

- и чо? Скомпилируется, а рантайм не пойдет - в строке, где мы конструктор ищем, выяснится, что класс у нас Nothing - упс!

Ну, Nothing - это инициальный объект; скала не нашла, какой там ClassTag подсунуть, и подсовывает ClassTag инициального.

Ну хорошо, хорошо, давайте подымемся по иерархии, и станем проверять параметр типа:

def inst[T >: Null](s: String)(implicit tag: ClassTag[T]): T = {
val cls = tag.runtimeClass
val cons = cls.getDeclaredConstructor(classOf[String])
cons.newInstance(s).asInstanceOf[T]
}

А хрен вам, опять в рантайме обломится. Потому что Null можно присваивать хоть кому (спасибо Хору).

Ну ладно, Null никто не подставляет. Запрещать имеет смысл только дефолтный Nothing.

Вот как это делается:

sealed trait NotNothing[-T]

object NotNothing {
@implicitAmbiguous("Method needs a generic parameter type, which is missing")
implicit val nothingIsNothing = new NotNothing[Nothing]{}
implicit def notNothing[T] = new NotNothing[T] {}
}

И затем пишем

def inst[T : NotNothing : ClassTag](s: String): T = {
import scala.reflect._
val cls: Class[T] = classTag[T].runtimeClass.asInstanceOf[Class[T]]
val cons: Constructor[T] = cls.getDeclaredConstructor(classOf[String])
cons.newInstance(s)
}

В результате компиляции

val a0 = inst[A]("good A")
val a1:A = inst("ana")
val b1:B = inst("ab")
видим

/Users/vpatryshev/projects/test/Test.scala:185:20
inst() method needs a generic parameter type, which is missing
val a1:A = inst("ana")


 
Чего и добивались.

juan_gandhi: (Default)
package scalakittens

/**
* A trait that describes a goodness of data or outcome or something
*
* Created by vpatryshev on 10/18/15.
*/
trait Goodness:
def isGood: Boolean
def isBad: Boolean = !isGood

trait PositiveAttitude extends Goodness { def isGood = true }
trait NegativeAttitude extends Goodness { def isGood = false}
juan_gandhi: (Default)

У меня есть набор тестов с топосной логикой; там расчеты довольно тяжелые; часа 2 с лишним уходило.

Переключился сейчас со скалы 2.12 на скалу 2.13, и jvm с 7 на 11.

В два раза быстрее. 

juan_gandhi: (Default)
That's about free profunctors casually dropping into the code

 https://www.youtube.com/watch?v=2yRtxYbV1h4


juan_gandhi: (Default)

John De Goes is Programming Without Type Classes



Type classes have become a cornerstone of statically-typed functional programming, powering abstractions like monoid and monad. Yet, type classes often have generalized names, which don’t reflect their purpose in specific domains; and they incur higher learning costs, especially when emulated in languages without them.

In this presentation, John De Goes discusses the pros and cons of using type classes, and presents a systematic method for building powerful functional components that do not require type classes. Attendees will learn how to preserve the benefits of principled, algebraic functional programming, without forcing type classes on coworkers or users.

Profile

juan_gandhi: (Default)
Juan-Carlos Gandhi

June 2025

S M T W T F S
1 2345 6 7
8 9 10 11 121314
15161718 1920 21
22232425262728
2930     

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jun. 26th, 2025 07:05 am
Powered by Dreamwidth Studios