Scala: Можно ли получить частично примененную функцию из левого сложения?

В настоящее время я изучаю Scala, и мне просто интересно, как сложить влево. Поскольку функция fold-left каррирована, вы сможете получить частично применяемую функцию (PAF) с первым параметром, как показано ниже.

(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) _

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

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


person Tamajin    schedule 02.03.2015    source источник
comment
Возможно, из-за ассоциации с оператором, поскольку он включает двоеточие с правой стороны. Попробуйте переместить подчеркивание влево.   -  person Carcigenicate    schedule 02.03.2015
comment
Вы также можете просто использовать foldLeft.   -  person Carcigenicate    schedule 02.03.2015
comment
Следует избегать использования /: и: \ вместо более явных foldLeft и foldRight. Вы можете прочитать это официальное руководство по стилю: docs.scala-lang.org/ style / method-invocation.html   -  person lambdista    schedule 03.03.2015


Ответы (2)


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

  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) _
    
person Ben Reich    schedule 02.03.2015

Я поигрался с ним и не смог найти подходящую конфигурацию.

Всегда есть более явный:

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

Что, возможно, более аккуратно. Я продолжу ковыряться.

Редактировать:

Вот это:

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

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

person Carcigenicate    schedule 02.03.2015