параметр для анонимной функции - PullRequest
0 голосов
/ 10 ноября 2010

Как вы отправляете параметр в анонимную функцию в scala, я пытаюсь перевести это из схемы

(cdr (map (lambda (x) (* x x)) somelist ) 

я знаю, что cdr - это простоанонимная функция похожа на (x: Int) => x * 2, 9

любая помощь приветствуется.

Ответы [ 3 ]

4 голосов
/ 10 ноября 2010

Здесь необходимо выполнить два вида перевода:

  1. От префиксной записи (функция предшествует аргументам) к инфиксной / постфиксной записи (метод между объектом и параметрами).

  2. От функционального (функция и данные не связаны жестко) к объектно-ориентированному (методы привязаны к объектам).

Я буду использовать точечную запись вScala, чтобы прояснить ситуацию.

Итак, в Лиспе есть (function arguments), поэтому довольно легко определить, каковы аргументы каждой функции.В Scala у вас есть object.method(parameters), поэтому давайте пройдемся по каждой функции Lisp, чтобы определить, что это за аргументы и что это за объект.

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

CDR

Как вы упоминали, это Scala'stail.Увы, tail - это метод без параметров, а cdr также получает только один параметр, поэтому нет необходимости в дальнейшем переводе.Следовательно,

(cdr (map (lambda (x) (* x x)) somelist))

становится частично переведенным

(map (lambda (x) (* x x)) somelist ).tail

MAP

В приведенном примере отсутствует аргумент, которыйтип результата.Итак, давайте предположим, что там был 'list.Перевод здесь более сложный, потому что map в Scala - это метод для коллекции, а не для функции.Таким образом, somelist является объектом, а (lambda (x) (* x x)) параметром метода.

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

(map (lambda (x) (* x x)) somelist).tail

в еще частично переведенный

somelist.map(lambda (x) (* x x)).tail

LAMBDA

Этот способ более сложный, поскольку в Scala нет метода, который является его эквивалентом, и не может быть, как нетМетод сможет связывать переменные.Тем не менее, lambda присущ языку со следующим синтаксисом:

(argument list) => expression

Следовательно,

(lambda (x) (* x x))

переводит (частично) в

((x) => (* x x))

Возвращаясь к примеру, у нас

somelist.map(lambda (x) (* x x)).tail

становится

somelist.map((x) => (* x x)).tail

Здесь есть два важных момента.Во-первых, Lisp динамически типизирован, поэтому нет необходимости объявлять тип x.Это не относится к Scala, которая может усложнить задачу, поскольку не существует общего типа для всех чисел.

Второй момент, однако, заключается в том, что Scala имеет вывод типа , поэтомуон может вывести тип x из типа somelist, что делает приведенный выше спорный пункт в данном конкретном случае .

Наконец,

*

Что часто бывает сложнее, поскольку действительно применимо ко всем имеющимся у вас аргументам.Обычный перевод

(* arguments)

- это

collection.reduceLeft((x, y) => x * y)

, где collection - это некая коллекция, содержащая все arguments.

. В этом случаеоднако, есть ровно два аргумента, поэтому он может быть переведен на собственный * в Scala.Итак, для заключительной части перевода мы берем

somelist.map((x) => (* x x)).tail

и превращаем его в

somelist.map((x) => x * x).tail

Надеюсь, где-то на пути был ответ на ваши сомнения.

3 голосов
/ 10 ноября 2010

Я не совсем уверен, что вопрос, так что это вызывает больше информации (или других ответов), чем что-либо еще:

List(1,2,3) map (x => x * x) tail // => List(4,9)

Это то же самое, что:

//blasted Scala still gets me -- List(1,2,3).map(x => x * x).tail()
List(1,2,3).map(x => x * x).tail

Где x => x * x - это лямбда в обоих случаях.

Над типом можно опустить, потому что он может быть выведен.Однако

// need the type here because it can't be inferred from context
val square = (x: Int) => x * x
2 голосов
/ 10 ноября 2010

Я не уверен, что вы хотите, я не знаю схему, может быть, такую:

val a = (x:Int) => x * 2
List(1,2,3).map(a)
List(1,2,3).map(_ * 2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...