Я плохо знаком с Scala и но очень стар к Java и имел некоторое понимание, работающее с языками FP как "Haskell".
Здесь я задаюсь вопросом, как реализовать это использование Scala. Существует список элементов в массиве, все они - строки, и я просто хочу знать, существует ли способ, которым я могу сделать это в Scala в FP путь. Вот моя текущая версия, которая работает...
def checkLength(vals: Array[String]): Boolean = {
var len = -1
for(x <- conts){
if(len < 0)
len = x.length()
else{
if (x.length() != len)
return false
else
len = x.length()
}
}
return true;
}
И я вполне уверен существует лучший способ сделать это в Scala/FP...
list.forall( str => str.size == list(0).size )
Edit: Вот определение, которое является таким же общим, как и собственник, а также позволяет проверить, является ли свойство, отличное от длины, одинаковым для всех элементов:
def allElementsTheSame[T,U](f: T => U)(list: Seq[T]) = {
val first: Option[U] = list.headOption.map( f(_) )
list.forall( f(_) == first.get ) //safe to use get here!
}
type HasSize = { val size: Int }
val checkLength = allElementsTheSame((x: HasSize) => x.size)_
checkLength(Array( "123", "456") )
checkLength(List( List(1,2), List(3,4) ))
Поскольку все кажутся такими креативными, я тоже буду изобретателем. : -)
def checkLength(vals: Array[String]): Boolean = vals.map(_.length).removeDuplicates.size <= 1
Имейте в виду, removeDuplicates
, скорее всего, будет называться отличным
в Scala 2.8.
Если вы знаете, что ваши списки всегда непусты, хорошо работает прямой поиск. Если вы этого не сделаете, это легко добавить в:
list match {
case x :: rest => rest forall (_.size == x.size)
case _ => true
}
Теперь списки нулевой длины возвращают истину, а не генерируют исключения.
Вот другой подход:
def check(list:List[String]) = list.foldLeft(true)(_ && list.head.length == _.length)
По моему опыту, R
является исключительно мощным языком в этих областях:
Манипуляция и преобразование данных.
Статистический анализ.
Графика.
Но R
ни в коем случае не является тройным пони. Я также применил этот язык к задачам, которые не полностью вписываются в вышеуказанные категории. Некоторые примеры:
Сценарий, помогающий в создании универсальных двоичных файлов OSX путем идентификации и сопоставления статических и динамических библиотек различных архитектур и последующего запуска результирующих групп через lipo
.
Скрипты для соскребания информации с веб-страниц.
Набор сценариев для создания изображений с географической привязкой, разрезания изображений на наборы с помощью GDAL
, формирования манифеста JSON
, описывающего выходные данные, и загрузки результата на веб-сайт для немедленного дисплея с помощью OpenLayers
.
Моя любимая часть использования R
- это частота, с которой я могу сказать:
-121--2066718-WHOA! Есть пакет, который делает ЭТО?!
Не могли бы вы также сделать:
class ContextException extends Exception {
public $context;
public function __construct($message = null, $code = 0, Exception $previous = null, $context=null) {
parent::__construct($message, $code, $previous);
$this->context = $context;
}
public function getContext() {
return $this->context;
}
}
Это позволило бы избежать необходимости создания экземпляра исключения, а затем выбросить его.
-121--4716927- Наконечники: Используйте forall
, чтобы определить, удовлетворяют ли все элементы в коллекции определенному предикату (например, равенство длины).