Pergunta

shortLinesOnly :: IO ()
shortLinesOnly = interact result
    where
        shortLength     = 11
        onlyShorts      = (<= shortLength) . length
        shortLines      = filter onlyShorts . lines
        result          = unlines . shortLines
        interact result = getContents >>= putStr . result

No código acima, como posso escrever a função interagir no estilo ponto livre.

Foi útil?

Solução

Passo a passo:

interact r = getContents >>= putStr . r
interact r = (getContents >>=) (putStr . r)
interact r = (getContents >>=) $ (putStr .) $ r
interact = (getContents >>=) . (putStr .)

Outras dicas

A melhor resposta é: não faça isso.Para este exemplo específico, a única alteração que faria é que seu código seria menos legível.Sua variante pontiaguda original está perfeitamente bem.

Em certos casos, é melhor evitar o estilo pointfree.Este é um deles, porque seu argumento não sofre fluxo de dados linear.É mais usado para construir o fluxo de dados para outra coisa.Exemplo:

-- Bad: Pointy linear data flow description.
chunksOf :: Int -> [a] -> [[a]]
chunksOf n xs =
    takeWhile (not . null) (map (take n) (iterate (drop n) xs))

-- Good: Pointfree linear data flow description.
chunksOf :: Int -> [a] -> [[a]]
chunksOf n =
    takeWhile (not . null) . map (take n) . iterate (drop n)

-- Bad: Now exaggerating with pointfree style.
chunksOf :: Int -> [a] -> [[a]]
chunksOf =
    liftA2 ((.) (.) . (.) $ takeWhile (not . null))
           (map . take)
           (iterate . drop)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top