@scala_ru

Страница 93 из 1499
Aleksey
14.09.2016
08:50:32
какой json
Для чего?

Nick
14.09.2016
08:51:04
Где?
toString у Point нельзя вызвать?)

Aleksey
14.09.2016
08:51:21
folex
14.09.2016
08:51:49
КТО СКАЗАЛ ГЕТТЕР

Google
Aleksey
14.09.2016
08:51:55
Нет, там какой-то ад был вообще не в тему.

Viacheslav
14.09.2016
08:52:53
вот таким образом как сейчас годные обсуждения и скатываются в срач

Aleksey
14.09.2016
08:53:22
toString у Point нельзя вызвать?)
А еще круто когда toString всегда возваращает что-будь типа «[Object]». Ну не определил человек toString

Nick
14.09.2016
08:54:04
ну и ладно, System.identityHashCode в качестве ключа норм)

вообще нужно исходить из того, что у тебя Map<String,String>

Nick
14.09.2016
08:55:30
если ты не можешь представить объект в String, то тут уже ничего не сделаешь

Aleksey
14.09.2016
08:56:18
вообще нужно исходить из того, что у тебя Map<String,String>
У нас уже был спро на эту тему. В джаве это справедливо потому что toString, equals и hashCode ты ручками определяешь. По этому юзать обекты в качестве ключей типа не ок. В Scala у нас руки развязаны.

если ты не можешь представить объект в String, то тут уже ничего не сделаешь
Да, по этому есть класстайм через который ты это доказываешь.

В общем это просто была иллюстрация отсутсвия изоморфизма.

Nick
14.09.2016
08:57:01
эт да, поэтому я бы на твоем месте определил trait c методом toKey )

Nick
14.09.2016
08:57:23
и если треита нету, то пшол вон )))

Google
Aleksey
14.09.2016
08:57:57
Так что тайпкласс.

Nick
14.09.2016
08:59:04
Так что тайпкласс.
на самом деле, toString хороший вариант, ибо программист сразу увидит проблемы и переопределит его )

Nick
14.09.2016
08:59:45
подожди) чтение эт другой разговор)

Aleksey
14.09.2016
09:01:04
Хочу напомнить что я начал собственно со чтения одиночного элемента в список, а потом говорил про неизоморфность JSON и скаловской системы типов.

Изоморфность подразмувает что можно в обе стороны фигачить.

Viacheslav
14.09.2016
09:04:46
ну дык об этом и речь, другие языки так не умеют, и человеки будут страдать

Daniel
14.09.2016
09:08:57
Алексей, ты точно о людях думаешь? Тут все в голос сказали, что нафиг приведение строки к списку. Хочется определенности. Что бы строка являлась строкой, а не тенью списка на стене темной пещеры. (голосом старика) не для того мы шли к неизменяемым переменным, чтобы потом освободившуюся голову загружать особенностями приведения значений.

Юрий
14.09.2016
10:08:44
Ребят, такой вопрос. У меня есть функция, примерно такого вида: def func[InputType, OutputType <: SomeWrapper[T]](input: T): OutputType И вызываю я ее сейчас так: func[Input, Output](input) В принципе, из контекста понятно какой тип идет на вход. Мне хочется сделать так, чтобы я в явном виде указывал только выходной тип, а не входной. Чтобы работало примерно также, как с имплиситами, но с типами. Примерно так: func[Output](input) // Input выведется компилятором из контекста

Vladimir
14.09.2016
10:10:31
нескромный вопрос, а зачем InputType вообще, если он в сигнатуре никак не используется?

Aleksey
14.09.2016
10:10:54
Похоже что должно быть что-то вроде def foo[From, To](x: From)(implicit conv: From => To): To

Grigory
14.09.2016
10:10:57
он опечатался T

Юрий
14.09.2016
10:11:05
Да сорян

там опечатка

Foo
14.09.2016
10:11:12
Тогда имплисит

Юрий
14.09.2016
10:11:22
def func[InputType, OutputType <: SomeWrapper[T]](input: InputType): OutputType

Aleksey
14.09.2016
10:11:42
А T в SomeWrapper[T] откуда?

Юрий
14.09.2016
10:11:50
епт :D

def func[InputType, OutputType <: SomeWrapper[InputType]](input: InputType): OutputType

во, вот так

Google
Grigory
14.09.2016
10:12:12
T = InputType опечатка же ну

Aleksey
14.09.2016
10:13:04
Судя по сигнатуре SomeWrapper умеет оборачивать любой InputType.

Юрий
14.09.2016
10:13:13
implicit conversion не подходит, потому что у меня его нету

нет, это не обертка

Aleksey
14.09.2016
10:13:48
Тогда def func[T](input: T): SomWrapper[T]

Тогда не достаточно данных что бы на вопрос ответить

Юрий
14.09.2016
10:15:41
смотри, у меня есть какой-то InputType. Для него есть какой-то SomeWrapper[InputType], который является трейтом. У него есть несколько наследников. Я хочу написать функцию, которая принимает на вход только ожидаемого наследника (`OutputType <: SomeWrapper[T]`) а остальные отбрасывает с правильной ошибкой.

Vyatcheslav
14.09.2016
10:16:01
trait Wrapper[T] { type Output; } def func[Input: Wrapper](x: Input): Unit = { println(implicitly[Wrapper[Input]]) } implicit val intWrapper = new Wrapper[Int] { type Output = String; override def toString(): String = "Int wrapper" } func(1) // prints Int wrapper

короче говоря, через абстрактные типы должно закатить.

Юрий
14.09.2016
10:17:50
в твоем варианте нету указания, какой конкретны Output должен быть

то есть один параметр тип я должен указывать в любом случае

а второй должен выводится

Vyatcheslav
14.09.2016
10:18:12
понял ) ща

trait Wrapper[InputT] { type Output def convert(input: InputT): Output } def func[Input](x: Input)(implicit w: Wrapper[Input]): Wrapper[Input]#Output = { w.convert(x) } implicit val intWrapper = new Wrapper[Int] { type Output = String def convert(input: Int): Output = s"Int wrapper for $input" } func(1) // prints "Int wrapper for 1"

Юрий
14.09.2016
10:21:59
я же писал выше, преобразования по бизнес логике нету

просто есть тип SomeWrapper[InputType]

а однозначного преобразования InputType => SomeWrapper[InputType] нету

Grigory
14.09.2016
10:26:08
можно так

def inferring[InputType](input: InputType) = new { def apply[OutputType <: SomeWrapper[InputType]]: OutputType = { println("ok"); null.asInstanceOf[OutputType] } }

только тут возможно будет проблема с типом

Google
Grigory
14.09.2016
10:26:29
val k = inferring("s")[SW]

и надо доказать что K = String

врядли окмпилятор может

Юрий
14.09.2016
10:26:45
вот я что-то такое и пытаюсь сделать в коде, с apply

Grigory
14.09.2016
10:27:02
object A { trait SomeWrapper[_] class SW extends SomeWrapper[String] def inferring[InputType](input: InputType) = new { def apply[OutputType <: SomeWrapper[InputType]]: OutputType = { println("ok"); null.asInstanceOf[OutputType] } } val k = inferring("s")[SW] }

а не

Admin
ERROR: S client not available

Grigory
14.09.2016
10:31:04
все впоряде

так можно

trait SomeWrapper[_] class SW extends SomeWrapper[String] def inferring[InputType](input: InputType) = new { def apply[OutputType <: SomeWrapper[InputType]]: OutputType = { println("ok"); null.asInstanceOf[OutputType] } } val k: SW = inferring("s")[SW]

Юрий
14.09.2016
10:34:41
да, прокатило

спасибо

но он попросил импортнуть scala.language.reflectiveCalls

и идея не понимает таких выкрутасов :D

Grigory
14.09.2016
10:35:55
:D надо самому записать эту штуку; малоли понадобится

Vyatcheslav
14.09.2016
10:36:47
по-моему пздц выглядит :) Маньяк-разработчик, который будет после вас это поддерживать, найдет ваш адрес и забьет насмерть книжкой Стива Макконнелла

Aleksey
14.09.2016
10:36:49
null.asInstanceOf[OutputType] АААААА new { AAAAA!!!!111

Grigory
14.09.2016
10:37:12
ну это для того чтоб инвок был в консоле))

Юрий
14.09.2016
10:37:29
можно вместо этого анонимного типа сделать конкретный

Google
Grigory
14.09.2016
10:37:32
TEST

Юрий
14.09.2016
10:37:38
ну, я сейчас пытаюсь это сделать

Nick
14.09.2016
10:40:37
@fomkin вообще просто сделай пропертю, что если прогер хочет такого поведения, то пусть и юзает

Nick
14.09.2016
10:41:52
@fomkin я так понимаю в макросы упрешься)

Aleksey
14.09.2016
10:43:02
@fomkin я так понимаю в макросы упрешься)
Нет. Писалка списков это имплисит. Его нужно конфигурить а) через глобальную переменную б) через другой имплисит.

Nick
14.09.2016
10:43:22
хм

Aleksey
14.09.2016
10:43:50
У меня раньше в пушке были имплисит конфиги, для того что бы Option писать как null иногда. Но этим ни кто за год не воспользовался и я это выпилил.

Другая тема, сделать разные наборы ридеров и райтеров для дефолтных типов. Типа import pushka.strict._, где там числа обязательно числа, а списки обязательно списки. И import pushka.nonstrict._ где все читается хрен пойми как.

Но это слишком поломает API. Я не готов везде переделывать.

Юрий
14.09.2016
10:52:29
Кому интересно - можно сделать так: class Inferring[InputType](input: InputType) { def apply[OutputType <: SomeWrapper[InputType]]: OutputType = { println("ok"); null.asInstanceOf[OutputType] } } def inferring[InputType](input: InputType) = new Inferring(input)И не нужно никаких reflective calls

Grigory
14.09.2016
10:53:10
отлично (:

Nikolay
14.09.2016
10:58:44
переделывай на мету)
Товарищи, я так понимаю, что на мету невозможно переписать либы использующие макросы, пока не будет готово это https://github.com/scalameta/scalameta/issues/436

Или я что-то не так понимаю?

Сейчас с помощью меты можно написать тулзы, которые берут текст скала кода из файла, перехерачивают его, и пишут обратно в файл(например форматтер scalafmt)

Ну или не из файла

Страница 93 из 1499