2015-03-02 3 views
4

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

(0 /: List(1, 2, 3)) _ 

На самом деле, у меня есть ошибка.

<console>:8: error: missing arguments for method /: in trait TraversableOnce; 
follow this method with `_' if you want to treat it as a partially applied function 

Тогда я попробовал то же самое, раз направо, например, как показано ниже

(List(1, 2, 3) :\ 0) _ 

Таким образом, он пошел правильно, и я мог бы получить СУП, такие как ((Int, Int) = > Int) => Int

Я знаю, что могу получить PAF с помощью метода foldLeft, но мне интересно, можно ли его выражать с помощью '/:' или нет.

+0

Возможно, из-за объединения оператора, так как она включает в себя прямую кишку на правой стороне. Попробуйте переместить знак подчеркивания влево. – Carcigenicate

+0

Вы также можете использовать foldLeft. – Carcigenicate

+0

Следует избегать использования /: и: \, предпочитая более явные foldLeft и foldRight. Вы можете прочитать это официальное руководство по стилю: http://docs.scala-lang.org/style/method-invocation.html – lambdista

ответ

3

Синтаксис подчёркивания не работает с право-ассоциативными методами, которые принимают несколько списков параметров. Вот варианты я вижу:

  1. Объявите тип переменной:

    val x: ((Int, Int) => Int) => Int = 0 /: List(1, 2, 3) 
    
  2. Аналогично, использование типа Приписывание:

    val x = (0 /: List(1,2,3)) : ((Int, Int) => Int) => Int 
    
  3. Используйте постфикс обозначения:

    val x = List(1,2,3)./:(0) _ 
    
  4. Используйте foldLeft синоним:

    val x = List(1,2,3).foldLeft(0) _ 
    
+0

Спасибо! Мне стало ясно. – Tamajin

1

Я играл с ним и не мог найти конфигурацию, которая работает.

Там всегда более определенно:

val f = List(1,2,3,4,5).foldLeft(0)_ 

Который, возможно, аккуратнее. Я все равно буду ковать.

Edit:

Там это:

val f2 = (0 /: List(1,2,3,4,5))(_: (Int,Int) => Int) 
val x = f2(_+_) 

Но это становится довольно некрасиво. Без аннотации типа он жалуется. Это лучшее, что я мог сделать.

 Смежные вопросы

  • Нет связанных вопросов^_^