Разница между похожими типами карри в Scala - PullRequest
9 голосов
/ 09 октября 2011

В чем разница между типами следующих двух функций?

def add1: Int => Int => Int = a => b => a + b
def add2(a: Int)(b: Int) = a + b

Судя по их объявлениям, они имеют одинаковый тип.Оба они называются одинаково:

scala> add1(1)(2)
res2: Int = 3

scala> add2(1)(2)
res3: Int = 3

Однако существует очевидная разница в их типах:

scala> :t add1
Int => Int => Int

scala> :t add2
(a: Int)(b: Int)Int

Кроме того, частичное применение add1 немного чище, чемadd2.

scala> add1(1)
res4: Int => Int = <function1>

scala> add2(1)(_)
res5: Int => Int = <function1>

Ответы [ 3 ]

7 голосов
/ 09 октября 2011

add1 - это метод без параметров, который возвращает Function1[Int, Function1[Int, Int]]. add2 - это метод, который принимает два списка параметров и возвращает Int.

Дальнейшее чтение:

Разница между методом и функцией в Scala

1 голос
/ 09 октября 2011

x.add1 - это функция Int => Int => Int.

x.add2 - это метод, который не является значением и не имеет тип, аналогичный add1.Чтобы получить объект, эквивалентный x.add1, вы должны использовать x.add2 _.

1 голос
/ 09 октября 2011

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

add1(1)
(Int) => Int = <function1>

add2(1)
<console>:9: error: missing arguments for method add2 in object $iw;
follow this method with `_' if you want to treat it as a partially applied function
       add2(1)

Однако, если вы частично примените add2, он будет того же типа, что и add1.

scala> :t add1
(Int) => (Int) => Int

scala> :t add2 _
(Int) => (Int) => Int

Я прекрасно понимаю, что add1.Это анонимная функция, которая принимает Int и возвращает Int => Int.Это классическое определение функции с карри.

Мне нужно больше читать, прежде чем я начну понимать add2.Насколько я могу судить, это метод написания функций, которые принимают свои параметры в другой форме (например, add2(1)(2)) и могут быть легко преобразованы в карри (add2 _).

Надеюсь, этопомогает!Я также с нетерпением жду лучшего объяснения о add2.

Редактировать: это отличный документ о методах карри в scala: http://www.codecommit.com/blog/scala/function-currying-in-scala

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...