Есть ли, что-нибудь как Haskell, 'возможно', функционирует встроенное в Scala?

расширение N STEP или NeXTSTEP / Sun в зависимости от того, кого Вы спрашиваете.

Sun имел довольно большие инвестиции в OpenStep некоторое время. Прежде чем Sun ввел изображение большинство вещей в основу, даже при том, что это не было известно как основа тогда, был снабжен префиксом NX, для NeXT, и когда-то непосредственно перед тем, как Sun ввел изображение, в которое все было переименовано к NS. S, скорее всего, не обозначал Sun тогда, но после того, как Sun, ступивший в общее согласие, был то, что это выдержало за Sun соблюдать их участие.

у меня на самом деле была ссылка для этого, но я не могу найти его прямо сейчас. Я обновлю сообщение, если/когда я найду его снова.

14
задан Will 7 August 2009 в 10:26
поделиться

5 ответов

Допустим, у вас есть объект oObject. Это может быть:

var oObject = {} ;
oObject["aaa"] = "AAA" ;
oObject["bbb"] = "BBB" ;
oObject["ccc"] = "CCC" ;
oObject["ddd"] = "DDD" ;
oObject["eee"] = "EEE" ;

Теперь предположим, что вы хотите узнать имена и значения его свойств, чтобы поместить их в переменные strName и strValue. Для этого вы используете конструкцию «for (x in o)», как в следующем примере:

var strName, strValue ;

for(strName in oObject)
{
   strValue = oObject[strName] ;
   alert("name : " + strName + " : value : " + strValue) ;
}

Конструкция «for (x in o)» будет перебирать все свойства объекта «o», и на каждой итерации , поместит в переменную "x" текущее имя свойства. Все, что вам нужно сделать, чтобы получить его значение, - это написать o [x], но вы это уже знали.

Дополнительная информация

После некоторых размышлений и после просмотра комментария Хэнка Гэя я чувствую дополнительная информация может быть интересной.

Давайте будем наивными (и забудем о том, что "в JavaScript все объекты, включая массивы, являются ассоциативными контейнерами").

14
ответ дан 1 December 2019 в 07:12
поделиться

Другие ответы дали состав map + getOrElse . Для записи вы можете «добавить» функцию возможно к Option следующим образом:

implicit def optionWithMaybe[A](opt: Option[A]) = new {
  def maybe[B](f: A=>B)(g: =>B) = opt map f getOrElse g
}

Стоит отметить, что синтаксис функций высшего порядка в Scala обычно лучше, когда параметр функции идет последним. Таким образом, лучший способ организовать , возможно, будет следующим:

def maybe[B](g: =>B)(f: A=>B) = opt map f getOrElse g

Это может быть использовано следующим образом:

val opt: Option[String] = ...
opt.maybe("") { _.toUpperCase }
16
ответ дан 1 December 2019 в 07:12
поделиться

Я не думаю, что есть. Лучшее, что я мог придумать, - это связать Option "map" и "getOrElse" вместе:

scala> var a: Option[String] = Some("hello")
a: Option[String] = Some(hello)

scala> a.map(_.toUpperCase).getOrElse("empty") 
res19: java.lang.String = HELLO

scala> a = None
a: Option[String] = None

scala> a.map(_.toUpperCase).getOrElse("empty")
res21: java.lang.String = empty
0
ответ дан 1 December 2019 в 07:12
поделиться

Я не думаю, что есть. Тем не менее, я бы написал это так, чтобы получить по имени g :

def maybe[A, B](a: Option[A])(f: A => B)(g: => B): B = a.map(f).getOrElse(g)

Это больше похоже на Scala и Haskell и немного приятнее в использовании.

0
ответ дан 1 December 2019 в 07:12
поделиться

Метод назывался бы fold, если бы он соответствовал соглашению (см. Either.fold, который является катаморфизмом для Either).

4
ответ дан 1 December 2019 в 07:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: