@scala_ru

Страница 256 из 1499
KrivdaTheTriewe
28.11.2016
13:49:34
val evenMax = numbers.toStream.filter( _ % 2 == 0).max val oddMax = numbers.toStream.filter( _ % 2 == 1).max чем плохо такое решение, кстати

folex
28.11.2016
13:52:56
и эксепшн кидается на пустой список

KrivdaTheTriewe
28.11.2016
13:53:43
А еще есть проблема, же, что возвращать если нет чётных чисел,или нечётных, или вообще, что функция должна возвращать.

Google
KrivdaTheTriewe
28.11.2016
13:54:38
два раза фильтруешь и сортируешь
сортировки не должно быть

Grigory
28.11.2016
13:56:20
)

KrivdaTheTriewe
28.11.2016
13:57:47
очень загадочно, если я ошибась, прошу указать на мою ошибку, дабы я устранил своё невежество в данном вопросе, пожалуйста

Grigory
28.11.2016
14:00:34
да, я не правильно написал, max и min для стрима это редьюс лефт

как и для списка

если не ошибаюсь, оба наследуют траверсабл ванс

Grigory
28.11.2016
14:03:05
можно не конвертировать в стрим; думаю такая же сложность будет

folex
28.11.2016
14:03:43
Pp
28.11.2016
14:03:55
Хмм

Жаль, потом обратно затупливать придется

KrivdaTheTriewe
28.11.2016
14:07:25
numbers.toStream.partition(_ % 2 == 0).map(_.max)
память будет использоваться дополнительная

нет?

Google
Pp
28.11.2016
14:09:20
Ай дунно

Vasily
28.11.2016
14:10:02
Хренью страдаете

KrivdaTheTriewe
28.11.2016
14:10:05
а это важно

Vasily
28.11.2016
14:10:15
Решается в два прохода

По коллекции

KrivdaTheTriewe
28.11.2016
14:10:33
нужен код

folex
28.11.2016
14:10:40
просто fold и в 1 проход, нет?

Vasily
28.11.2016
14:10:48
Тока на f# могу :)

KrivdaTheTriewe
28.11.2016
14:11:15
Тока на f# могу :)
я тебя наслушался, немного посмотрел туда, там прикольно

Vasily
28.11.2016
14:11:32
В целом можно в один прохход без фолда

Две переменные под максимумы

Если фолд, то в качестве аккума tuple

Он же кортеж

KrivdaTheTriewe
28.11.2016
14:14:01
Тут ключевой вопрос, что делать с валидацией данных

?Ivan
28.11.2016
14:14:17
l.foldLeft[(Option[Int], Option[Int])]((None, None)) { case ((odd, even), v) => if (v % 2 == 0) (odd.map(m => math.max(m, v)), even) else (odd, even.map(m => math.max(m, v))) }

хотя нет, днище

Igor
28.11.2016
14:15:49
почему? по-моему норм

осталось причесать

?Ivan
28.11.2016
14:16:14
none всегдя маппиться в none

Pp
28.11.2016
14:16:18
Можно if в гварды засунуть

Google
Pp
28.11.2016
14:16:27
Можно даже сравнение туда засунуть

Будет аккуратно и читабельно, но много печатать

Alex
28.11.2016
14:17:58
там надо нулём инициализировать и отдельно проверять на пустоту

Aleksei
28.11.2016
14:18:24
а если максимум отрицательный? )

Alex
28.11.2016
14:18:38
ну MINVALUE

KrivdaTheTriewe
28.11.2016
14:22:20
а если максимум отрицательный? )
чётность не опредлена же для отрицательных чисел ?

не?

folex
28.11.2016
14:22:43
для всех целых

N, вот это всё

KrivdaTheTriewe
28.11.2016
14:23:35
Да, ошибся, прошу прощения

?Ivan
28.11.2016
14:24:51
как то так: val l = List(1,2,3,4) def max(v: Int, prevValue: Option[Int]) = { prevValue match { case None => v case Some(x) => math.max(v, x) } } l.foldLeft[(Option[Int], Option[Int])]((None, None)) { case ((odd, even), v) => if (v % 2 == 0) (Some(max(v, odd)), even) else (odd, Some(max(v, even))) }

Oleksandr
28.11.2016
14:25:00
var odd = Option.empty[Int] var even = Option.empty[Int] for (i <- numbers) { if (i ℅ 2 == 0) odd match { case Some(old) if old < i => odd = Some(i) case None => odd = Some(i)

Oleksandr
28.11.2016
14:25:20
ну и для нечетных

Vasily
28.11.2016
14:25:27
Без фолда поинтереснее

Oleksandr
28.11.2016
14:25:27
лениво с моба писать все

интересно, можно ли не писать "odd = Some(i)" дважды, как-то вывернуть этот иф

KrivdaTheTriewe
28.11.2016
14:26:10
varчики подъехали

Oleksandr
28.11.2016
14:26:42
как будто что-то плохое

Pp
28.11.2016
14:32:31
Будет аккуратно и читабельно, но много печатать
l.foldLeft[(Option[Int],Option[Int])]((None, None)) {   case ((Some(odd), even), v) if v % 2 == 1 && odd < v => (Some(v), even)   case ((odd, even), v) if v % 2 == 1 => (odd, even)   case ((odd, Some(even)), v) if even > v => (odd, Some(v))   case ((odd, even), v) => (odd, even) }

Google
Oleksandr
28.11.2016
14:33:33
а теперь добавь ещё аналогичные минимумы

Pp
28.11.2016
14:33:34
Можно не разделять odd и even на 2 и 4 строчке, вместо v написать _

Oleksandr
28.11.2016
14:34:09
не, я про поиск 4 чисел

мин/макс чет/нечет

Admin
ERROR: S client not available

Oleksandr
28.11.2016
14:34:32
у фолда сложность линейная

(количество кода, который надо добавить)

Alex
28.11.2016
14:35:12
да просто скомпозить два моноида

KrivdaTheTriewe
28.11.2016
14:37:48
Мне нравится этот подход !

<dependency> <groupId>org.scalaz</groupId> <artifactId>scalaz-core_${scala.suffix.version}</artifactId> </dependency> врывается в тред , да у меня нет sbt на проекте :(

Grigory
28.11.2016
14:39:23
противник джава стайла)

Oleksandr
28.11.2016
14:43:26
да просто скомпозить два моноида
самое забавное, что, в общем случае, нельзя (надо руками, не автомагически)

?Ivan
28.11.2016
14:43:47
val l = List(1,2,3,4) def value(v: Int, prevValue: Option[Int], f: (Int, Int) => Int) = { prevValue match { case None => Some(v) case Some(x) => Some(f(v, x)) } } case class Result(a: Option[Int], b: Option[Int], c: Option[Int], d: Option[Int]) l.foldLeft(Result(None, None, None, None))((r, v) => if (v % 2 == 0) r.copy(a = value(v, r.a, math.min), b = value(v, r.b, math.max)) else r.copy(c = value(v, r.c, math.min), d = value(v, r.d, math.max)) )

Alex
28.11.2016
14:44:36
общий то зачем

folex
28.11.2016
14:45:09
#codegolfday

Alex
28.11.2016
14:45:51
сделать два инстанса полугруппы для Even и Odd и потом xs.fold[(Option[Even], Option[Odd])]

KrivdaTheTriewe
28.11.2016
14:46:00
Имхо Int на Long стоит заменить

?Ivan
28.11.2016
14:49:19
Имхо Int на Long стоит заменить
или какую-нибудь магию с тайп-классами

чтобы тип вообще не указывался, а выводился из коллекции

Google
Vasily
28.11.2016
14:56:05
Я сделяль...

let findMax (x:int option) (y:int option)= match x,y with |Some a ,Some b->Some (Math.Max(a,b)) |Some a,_->x |_,Some b->y |_,_->None let isEven (number:int option)= match number with |Some x when x%2=0->Some true |Some x when x%2<>0->Some false |_->None let calcMax arr = arr|>Seq.fold (fun (even,odd) x-> match isEven x with |Some true-?findMax even x),odd) |Some false-?even,(findMax odd x)) |_-?even,odd))

Типизация по вкусу соответственно

KrivdaTheTriewe
28.11.2016
15:15:09
в F# смайликами программируют?

Mikhail
28.11.2016
15:15:36
у тебя ненужное условие в isEven

да и функция работает неправильно)

хотя там же инт на входе, тогда просто ненужное

Vasily
28.11.2016
15:26:51
Там опшн на входе

Опшн на выходе

Mikhail
28.11.2016
15:27:38
тощно)

Vasily
28.11.2016
15:36:48
В условии у нас коллекция опшнов, соответственно и работаем с опшнами по возможности

?Ivan
28.11.2016
15:41:32
Alex
28.11.2016
15:43:06
да вроже норм

только двойные скобки убрать

( o => { }) -> { o => }

?Ivan
28.11.2016
15:43:56
да, точно проглядел

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