Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

244
Visualizações
Composición con expresiones lambda haskell

Intento un ejemplo ficticio de usar composición con expresión lambda. El siguiente código se compila, pero no se ejecuta cuando intento (fg) 3 2

 fx = x^2 gx = 5*x fg = \x -> f(gx)

Da tal error:

 Ambiguous occurrence `.' It could refer to either `Prelude..', imported from `Prelude' at list3.hs:1:1 (and originally defined in `GHC.Base') or `Main..', defined at list3.hs:42:3.

¿Puede alguien decirme dónde está el problema?

over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

Ha definido un operador de composición que existe junto con el importado de Prelude. No hay nada malo con la definición ; el problema ocurre cuando intenta usarlo , ya que el compilador no puede decir si algo como

 main = print $ f . g $ 10

se supone que debe usar . del Preludio o . desde su módulo Main .

Una solución es simplemente ser explícito sobre cuál de los dos quieres.

 f . g = \x -> f (gx) main = print $ f Main.. g $ 10

o no importar la versión de Prelude en primer lugar.

 {-# LANGUAGE NoImplicitPrelude #-} import Prelude hiding ((.)) -- Now this is the *only* definition. f . g = \x -> f (gx) main = print $ f . g $ 10
over 4 years ago · Santiago Trujillo Relatório

0

Como se explica en la excelente respuesta de Chepner, su '.' El operador punto está en conflicto con el '.' normal. operador implícitamente importado de Haskell Prelude. Esto es lo que significa el mensaje de error.

Afortunadamente, el conjunto de caracteres Unicode es compatible con el compilador Haskell, y ofrece el carácter de composición de funciones adecuado como se ve en los libros de matemáticas, es decir, '∘', en la posición decimal 8728.

Y este operador '∘' NO está (todavía) definido por el Preludio.

Por lo tanto, el siguiente código funciona bien:

 main :: IO () main = do let -- our own function composition operator: fna ∘ fnb = \x -> fna (fnb x) -- Unicode character #8728 (decimal) fx = x * x gx = 5 * x h = f ∘ g -- composed function res = h 7 putStrLn $ "res = " ++ (show res)

e imprime un resultado de 1225, como era de esperar.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda