Есть ли способ написать этот код Haskell в Scala?

Я изучаю несколько языков функционального программирования, изучаю интересные вещи и сейчас присматриваюсь к Scala. Я пытаюсь найти самый простой способ написать функцию с именем double, которая принимает один аргумент и удваивает его. Что я придумал до сих пор:

def double = (x:Int) => x*2

or

def double(x:Int) = x*2

Это работает, но я ищу самый простой способ. В Haskell я мог бы просто сделать это:

double = (*2)

Поскольку это частично применяемая функция, нет необходимости называть переменную или указывать какие-либо типы (я уверен, что функция * позаботится об этом). Есть ли аналогичный способ сделать это с помощью Scala? Я пробовал несколько, особенно используя _ вместо x, но ни один из них не работал.


person Hassan    schedule 08.06.2013    source источник


Ответы (2)


Как насчет этого:

val double = (_: Int) * 2

Примечание Здесь double означает Function, а не method. В первом примере вы определили method с именем double с типом возвращаемого значения Function. Во втором примере вы только что определили method. Function отличается от method в Scala.

В случае, если компилятор может получить информацию о типе, мы можем написать Function даже просто:

scala> def apply(n: Int, f: Int => Int) = f(n)
apply: (n: Int, f: Int => Int)Int

scala> apply(10, 2*)
res1: Int = 20

scala> apply(10, 100+)
res2: Int = 110
person Eastsun    schedule 08.06.2013
comment
Функция отличается от метода в Scala. Казалось бы, очень важный факт, о котором я не знал. Спасибо, что прояснили это. - person Hassan; 08.06.2013
comment
Вау. Я никогда не знал, что мы можем пройти 2* таким образом. Спасибо. - person Jatin; 08.06.2013

Самый короткий способ написать это

*2
person user unknown    schedule 08.06.2013
comment
Как это можно установить в val? Я попробовал val double = *2, но мне это не понравилось. - person Hassan; 08.06.2013
comment
Нет, вы вообще не пишете val double = , просто *2 там, где вам нужно. Это означает то же самое, понятно и позволяет избежать путаницы с java.lang.Double и т.п. - person user unknown; 08.06.2013