Qual é o nome de λx.λf.fx (como aplicação inversa) no cálculo lambda? A função correspondente possui um nome padrão na programação?


15

Qual é o nome de λx.λf.fx no cálculo lambda?

A função correspondente possui um nome padrão em linguagens de programação funcional, como Haskell?

Na programação orientada a objetos, existe um nome comum para um método fooque assume uma função como argumento, que x.foo(f)retorna f(x)?


3
Você precisa comprar um dicionário.
Robert Harvey

13
Qual? Onde? Quanto?
Alexey

4
Eu não entendo os votos negativos. Parece uma pergunta perfeitamente razoável para mim.
Giorgio

Tenho postado uma resposta abaixo, mas eu percebi que o OP foi perguntando o que é o nome desta expressão lambda para que eu apagado = D
Jason

O conceito a que você se refere é conhecido como combinador, leia aqui se você não estiver familiarizado en.wikipedia.org/wiki/SKI_combinator_calculus, embora eu não esteja familiarizado com um combinador conhecido da natureza a que você se refere, C de O BCKW está próximo (é flip), mas não é o mesmo pt.wikipedia.org/wiki/B,C,K,W_system por que não se divertir e criar a combinação desses combinadores que resultam em sua função :)
Jimmy Hoffa

Respostas:


9

Em Haskell, \x.\f.f xé o flip ($)que $é lido como aplicável , eu leria como aplicação inversa .

Basicamente, com base em /programming/4090168/is-there-an-inverse-of-the-haskell-operator


Este errado ... flip está \f.\x.\y.f y xaleta é C aqui en.wikipedia.org/wiki/B,C,K,W_system
Jimmy Hoffa

também adicionando $para virar como este está esperando uma função parcialmente aplicada que leva mais de 2 argumentos para onde está indo apenas para virar a última 2 para que se aplicam parcialmente todos, mas aqueles 2
Jimmy Hoffa

6
Então você duvida que isso (\f.\x.\y.f y x) (\f.\x.f x)reduz a (\x.\f.f x)renomeação de módulo? O que faz.
Dan D.

5

Usando os combinadores padrão, você pode expressar esta função como

C I

Onde

C f x y = (f y) x

Em Haskell, seria

flip id

Aqui ido tipo é especializado em (a -> b) -> a -> band flipswaps a -> be a.

Você também pode expressá-lo no cálculo SKI :

S (K (S I)) K

+1 para deduzir os combinadores para isso. Eu realmente não suspeito que é uma coisa muito conhecido, embora se como ele identificou É algo relacionado com numerais igreja, eu estou inclinado a pensar se CI está documentado em qualquer lugar tão relevante em estudos numeral anyones igreja
Jimmy Hoffa

5

No original Alonzo Church, "O cálculo de lambda-conversão", ele denota este combinator por T .

No contexto de numerais da Igreja, é chamado exp . Isso corresponde à notação "abreviada" usada pela Igreja para a "aplicação" de um termo N ao termo M : "[ M N ]" significa "( NM )".

Ainda não ouvi um nome padrão para uma função análoga na programação.


3

Isso às vezes é chamado de combinador de thrush e, no Clojure, é chamado de macro thread-first . Seu principal uso é permitir que você expresse uma computação como uma série de computações encadeadas na ordem em que são executadas. Por exemplo, pegar um valor x, passá-lo para uma função fe depois passar os resultados f(x)para uma função g, seria escrito como g(f(x))usando composição de função padrão (ou g (f x)se você estiver trabalhando com parênteses implícitos.) Isso pode ser estranho quando há um grande número de funções encadeadas, porque você precisa lê-las na ordem inversa de como elas são executadas. O combinador de sapinhos permite que você expresse isso de maneira diferente, se definirmos o combinador de sapinhos como:

T x f = f x
T x f g ... = T (T x f) g ...

Então a expressão T x f g hse torna h (g (f x)).

(Para quem procura mais informações e uma implementação concreta no idioma Racket, tenho uma postagem no blog sobre o assunto: Thrush Combinator in Racket )


2

Espero entender sua pergunta corretamente, mas acredito que isso seja conhecido como o operador de tubulação (reverso) nos idiomas ML.

[1; 2; 3] |> List.map sq // let it = [1; 4; 9]

Há também o Operador de Tubo Reverso que ajuda na ordem das operações.

printf "The value is.." <| 2 + 3 // let it = "The value is..5"

Isso é útil porque o formulário não encaminhado

printf "The value is.." 2 + 3 ;; error

erro porque printf tentaria avaliar "The value is.." 2e erro porque não há +operador definido . Para fazer esse trabalho, use parênteses:

printf "The value is.." (2 + 3) // let it = "The value is..5"

Quanto ao uso prático, o |>operador é incrivelmente útil e o pão com manteiga de muitas linguagens inspiradas em ML e ML, como F #, LiveScript e Elixir. <|é menos comum e normalmente usado apenas quando aumenta a legibilidade.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.