2013-08-12 3 views
0

Я пытаюсь понять исчисление лямбда с просами и рубинами. Вот код:Исчисление рубин и лямбда

puts -> x { -> y {x.call(y) } } 
# => #<Proc:[email protected]:/first-ruby.rb:1 (lambda)> 

puts -> x { x + 2}.call(1) 
# => 3 

Что -> означает в приведенном выше примере? Способ call передаёт значение вызывающему, поэтому в первом примере значение y передается в y, а во втором примере 1 передается в x? Во втором примере почему 1 оценивается как x?

+0

Вы пытаетесь понять Ruby или Lambda Calculus? У вас действительно много кошек в этой сумке. У вас есть хорошие ответы на вопрос о том, как Ruby делает лямбды различными способами. Лямбда - это Proc. Из документа ядра «Эквивалент Proc.new», за исключением того, что в результате объекты Proc проверяют количество параметров, передаваемых при вызове ». Итак, у ядра есть функция лямбда или метод, но вы можете узнать больше, глядя на Proc, у которого есть лямбда? и является проверкой типа Proc, где дополнительные аргументы игнорируются для обычных объектов Proc, но для lambdas могут возникать ошибки. –

+0

К сожалению, функция -> имеет очень мало документации в Ruby, поэтому мы должны полагаться на сообщество Ruby, чтобы найти его использование. Я не специалист по компьютерным наукам, но логика его тесно связана с https://en.wikipedia.org/wiki/Lambda_calculus –

+0

. Я нашел термин для этого. Попробуйте «анонимные лямбды» в Ruby –

ответ

1

Что означает -> в приведенном выше примере?

-> является частью буквального синтаксиса для лямбды, так же, как, скажем, ' является частью буквального синтаксиса для строк.

ли .call метод просто передавая значение от абонента,

Метод call является метод, который, ну, вызывает (или выполняет) лямбда. Аргументы метода call связаны с параметрами лямбда.

так что в первом примере значение y передается y и во втором примере 1 передается x.

Нет, в первом примере, y передается внешней лямбда и связан с его параметром x. Во втором примере 1 передается лямбда и привязывается к его параметру x.

Во втором примере почему, как 1 оценивается как x?

1 не дает оценку x. 1 - это немедленное значение, а в Ruby, немедленные значения всегда оценивают для себя. 1 будет всегда оценить до 1, never до x или что-нибудь еще.

2

Это ярлык для выражения чистой лямбды:

lmbd = -> arg{ something to do with arg } # With ->{} notation 

lmbd = lambda { |arg| something to do with arg } # Standard notation 

В первом примере вы вызываете метод Кладет с Proc (лямбда) объектом, и именно поэтому вы видите #<Proc:[email protected]:/first-ruby.rb:1 (lambda)> на выходе.

Во втором примере вы вызываете puts с помощью метода lmbd.call (1), т. Е. Выводит результат вычисления лямбды.

Итак, если у вас есть lmbd переменных, которая является объектом лямбды, вы можете передать его, как любой аргумент, а затем получить его результат по Invoke lmbd.call():

lmbd = -> greeting{ puts "#{greeting}, lambda-expression!" } 

def say_hello l, text 
    l.call(text) 
end 

say_hello lmbd, "Aloha" # => Aloha, lambda-expression! 
0

Давайте определим функцию с помощью Ruby, лямбды.

def plus_two # no args here 
    ->(x) {x + 2} # args go here 
end 

# assign a value 
x = 1 

# call it 
plus_two.call(x) 
# => 3 

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

Попробуйте сделать рекурсию, используя эти. Это как вызов функций функций n раз. Что будет тогда базовым кейсом?

Что касается лямбда-исчисление https://github.com/mackorone/lambda/blob/master/intro.pdf

Try, чтобы держать вещи простыми и показать шаги, а не пытаться понять, что делает один вкладыш. Да, они хороши, но если вы не можете прочитать это, вы не можете это понять.

Вот что-то я совсем недавно работал на:

require 'date' 

num = DateTime.now.to_time.utc.to_datetime.ajd - 2451545.0 
@t = num/36525.0 

# the terms in reverse order form for the array 
@l0_a = [1.0/-19880000.0, 
     1.0/-152990.0, 
     1.0/499310.0, 
     0.0003032028, 
     36000.76982779, 
     280.4664567] 

# make an enumerator 
@l0_e = @l0_a.each 

# make a lambda to pass the enumerator to. 
def my_lambda 
    ->(x) {x.reduce {|acc, el| acc * @t + el} % 360} 
end 

puts my_lambda.call(@l0_e) 

Это средняя долгота формулы солнца с использованием методов Enumerator и, конечно лямбда.

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

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