Comments 12
Это у вас вышло хорошо. Спасибо.
Наконец-то вменяемое описание композиции Клейсли для инженеров, а не для математиков! Спасибо!
проблема подобного кода в том, что без соответствующей статьи с пояснениями его поддерживать невозможно
да не знаю, вроде после того, как узнаешь про Kleisli всё нормально читается. Может я, конечно, не видел обфусцированного каким-нибудь партизаном кода)
скале с кучей имплиситов можно потом очень долго пытаться понять какие преобразования и откуда применилисьвот это я вообще каждый раз удивляюсь как встречаю, что IDE отменили? вроде уже даже Eclipse умеет переходить в имплиситы и подчёркивать их
вот это я вообще каждый раз удивляюсь как встречаю, что IDE отменили? вроде уже даже Eclipse умеет переходить в имплиситы и подчёркивать их
В том то и дело, что для того, чтобы понять, что же происходит, надо по каждому методу тыкать ctrl+click и смотреть куда в итоге попадешь, а имплиситы могут быть и многоуровневыми (особенно во всяких Scalaz). В то время как обычный код можно просто читать. Из-за этого разница в скорости понимания происходящего будет в разы.
Из-за этого разница в скорости понимания происходящего будет в разы
Зато можно быстро понять идею, что в некоторых случаях куда полезнее. Тут скорее вопрос ситуации
В scalaz вообще неприпомню необходимости лазать по имплиситам, там они — средство реализации. Если не понимать идей scalaz, разматывание кода по ниточкам не особо приводит к смыслу) На себе ощутил
Не хотел обидеть
Ну что вы, никто и не думал обижатся. Мы тут, по возможности конструктивно, просто обмениваемся личными мнениями, а они не обязаны совпадать )
Извините, что не "в тему", но что за color scheme на скриншоте? :)
Имхо, слишком сложно для использования на практике.
Начиная с первого же куска кода, зачем использовать for-yield, если можно намного проще?
def getByPath(path: List[String], root: XmlNode): Option[XmlNode] = path match {
case name::names =>
root.child.find(_.label == name).flatMap { child =>
getByPath(names, child)
}
case _ => Some(root)
}
Или еще понятнее:
def getByPath2(path: List[String], root: XmlNode): Option[XmlNode] = path match {
case name::names =>
root.child.find(_.label == name) match {
case Some(child) => getByPath(names, child)
case None => None
}
case _ => Some(root)
}
Объем кода такой же, а понять его не в пример проще. Возвращать сообщение об ошибке — так оно уже возвращается, если None — то данные не найдены. Обернуть Option в любой другой тип в отдельной функции и всё.
Что касается обобщенного кода: Scala-компактный язык. В большинстве случаев лучше написать рядышком еще одну реализацию в несколько строк, что будет и проще, и, как правило, быстрее исполняться.
Проблема Scala в том, что он, по сути, содержит в себе два языка программирования — качественный промышленный и обширный экспериментальный. Множество попыток внедрения скалы провалилось из-за того, что первые энтузиасты тщательно зашифровывали исходники библиотеками типа scalaz, превращая текст в подобие двоичного дампа. В этом плане полезно изучить опыт Twitter, а также их исходники.
Рефакторинг при помощи композиции Клейсли